Я использую 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)
Благодарю!
Параметр не допускается после того, как is
. Вы должны написать IS NULL
или IS NOT NULL
качестве фиксированных выражений.
То, что разрешено, будет = $1
а затем установите для этого заполнителя значение null
, но это не приведет к тому, что вы ожидаете, поскольку сравнение с NULL
всегда unknown
.
См. Связанные вопросы:
@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
а также для любой другой стоимости.