Ошибка JDBC в состоянии IS NULL

1

Я использую JDBC от Scala, используя библиотеку ScalikeJDBC.

Возьмем простой запрос: UPDATE "test_table" SET "test" = 1234 WHERE ("asdad" is null)

Если я передаю этот запрос непосредственно в psql или выполняю его через JDBC, все будет работать нормально. Но если я попытаюсь передать значение null в качестве параметра, я получаю следующую ошибку: org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"

Я null значение null следующим образом:

session.update("""UPDATE "test_table" SET "test" = 1234 WHERE ("asdad" is ?)""", null)

? Заполнитель автоматически преобразуется в $1 библиотекой ScalikeJDBC. Выполненный запрос отображается в консоли Scala:

   UPDATE "test_table" SET "test" = 1234 WHERE ("asdad" is null)  

Благодарю!

Теги:
jdbc

2 ответа

3
Лучший ответ

Параметр не допускается после того, как is. Вы должны написать IS NULL или IS NOT NULL качестве фиксированных выражений.

То, что разрешено, будет = $1 а затем установите для этого заполнителя значение null, но это не приведет к тому, что вы ожидаете, поскольку сравнение с NULL всегда unknown.

См. Связанные вопросы:

Почему NULL = NULL оценивает значение false на сервере SQL

Есть ли разница между IS NULL и = NULL

  • 0
    Благодарю. Какой предпочтительный способ передать «IS NULL» со стороны пользователя? Самым простым способом, который я могу себе представить, является простая простая интерполяция строк, но это не лучший способ.
  • 0
    Да, строка. Это часть выражения запроса, поэтому, если вы хотите чередовать «IS NULL» и «IS NOT NULL» в зависимости от какого-либо условия, это, вероятно, лучший способ.
Показать ещё 2 комментария
2

@Janick дал безупречное объяснение - за исключением того, что его ссылки для SQL Server (которые, как утверждают, используют стандартный SQL в этом случае). Прочтите руководство по Postgres.

Вы все же можете параметризовать один запрос со стандартными операторами:

session.update("""UPDATE test_table
                  SET    test = 1234
                  WHERE  asdad = ?
                  OR    (asdad IS NULL) = ?
              )""", null, true);

И для любого другого значения:

              ... , 123, false);

Обязательно соблюдайте приоритет оператора, если вы добавляете дополнительные условия WHERE.

IS NOT DISTINCT FROM

Еще лучше, используйте это:

session.update("""UPDATE test_table
                  SET    test = 1234
                  WHERE  asdad IS NOT DISTINCT FROM ?
              )""", null);

Работает для NULL а также для любой другой стоимости.

  • 0
    Это интересное понимание, спасибо за совет! На самом деле мне нужно поддерживать различные базы данных, например, MySQL, Postgres и SQL Server.
  • 0
    На самом деле оба решения являются стандартными SQL: stackoverflow.com/questions/10416789/… . К сожалению, не все RDBMS пытаются реализовать стандартные функции так же амбициозно, как Postgres ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню