Невозможно запустить CASE WHEN для массива в репозитории Spring Boot

Я пытаюсь запустить это

@Query(value = "SELECT t.*\n" +
            "FROM tlm_trade t\n" +
            "left join tlm_trade_nugget n\n" +
            "on t.trade_nugget_id=n.id\n" +
            "where \n" +
            "(year(t.created_date) in (case when ?1 is null then year(t.created_date) else ?1 end))\n" +
            ";", nativeQuery = true)
    List<TlmTrade> findByFilter(Set<Integer> year);
;

Когда я передаю это как аргумент


[2021,2020,2019]

Получил эту ошибку вместо

SQLException: Operand should contain 1 column(s)

Есть идеи, что случилось?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
16
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

case when ... end - это expression, они оценить до единственного значения.

В вашем примере вы надеетесь, что вы можете использовать case expression в качестве «динамического sql». т.е. если? 1 равно нулю, тогда вставьте термин "год (t.created_date)", но если? 1 не равно нулю, то вставьте? 1

Ты не можешь сделать это.

Было бы разумнее сделать это путем ветвления перед формированием @Query, одна ветвь для? 1 имеет значение null, а другая, которая использует? 1

Кроме того, избегайте выражений case в предложениях where, фильтры лучше выражать в двоичных терминах, например, здесь, используя круглые скобки, где это необходимо:

"where (?1 IS NULL AND year(t.created_date) = '2021' )\n"

«1, кстати, должен будет что-то равняться или быть больше чем-то и т. д.» 1 сам по себе не будет формировать условие фильтрации.

Другие вопросы по теме