Как параметризовать SQL-запрос, когда параметр иногда может быть NULL?

С помощью pyodbc я могу параметризовать запрос следующим образом;

value = "testval"

query = \
    """
    SELECT *
    FROM TestTable
    WHERE Column = ?;
    """

cursor.execute(query, value)

Но проблема в том, что если value равно None, запрос должен выглядеть так;

value = None

query = \
    """
    SELECT *
    FROM TestTable
    WHERE Column IS NULL;
    """

cursor.execute(query)

Итак, как должен выглядеть запрос, когда value может быть либо None, либо строкой;

value = get_value()  # can return a string or None

query = \
    """
    SELECT *
    FROM TestTable
    WHERE Column ???????????
    """

cursor.execute(query, value)

person ruohola    schedule 24.09.2018    source источник


Ответы (1)


Решение состоит в том, чтобы использовать стандартное NULL-безопасное сравнение ISO/ANSI:

WHERE Column IS NOT DISTINCT FROM ?

Не все базы данных поддерживают это, поэтому вы также можете использовать:

WHERE Column = ? OR (Column IS NULL AND ? IS NULL)

Если вы не хотите передавать параметр дважды, вы можете включить его в предложение FROM:

. . .
FROM . . . CROSS JOIN
     (SELECT ? as compColumn) params
WHERE (Column = params.compColumn0 or (Column IS NULL and params.compColumn IS NULL)
person Gordon Linoff    schedule 24.09.2018
comment
Правильно ли я понимаю, что первый не будет работать с sql-сервером? - person ruohola; 24.09.2018