Как параметризовать SQL-запрос, когда параметр иногда может быть NULL? - PullRequest
0 голосов
/ 24 сентября 2018

С помощью 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)

1 Ответ

0 голосов
/ 24 сентября 2018

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

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)
...