5

次のような SQLite クエリがあります。

SELECT max(e), url, branch FROM (SELECT max(T1.entry) e, T1.url, T1.branch FROM repo_history T1
                                                        WHERE (SELECT active FROM repos T2 WHERE url = T1.url AND branch = T1.branch AND project = ?1)
                                                        GROUP BY T1.url, T1.branch
                                                        UNION
                                                        SELECT null, T3.url, T3.branch FROM repos T3 WHERE active AND project = ?1 )
                               GROUP BY url ORDER BY e

パラメータが 2 回出現することに注意して?1ください。とにかく、場合によってはnullになる可能性があります(None私が知る限り、PythonではNULLSQLiteになります)。null の扱いがわからないので困っていますが、基本的に何も返ってきません。

では、NULL のwhere "project" = ?1場合はどのように処理すればよいでしょうか。?12 つの別々のクエリを使用することは避けたいと思います。IS NULL周りを見回しましたが、 /に関するものしか見つかりIS NOT NULLません。これは、列がnullかnullでないかを確認しようとしているのではなく、2つのnull許容値が一致するかどうかを確認しようとしているため、うまくいきません、それらがnullかnullでないか。

4

1 に答える 1

11

ISSQLiteでは、NULL トレラントな比較に = の代わりに演算子を使用できます。挿入でも機能し?ます (MikeT とは異なります)。

Python の例:

>>> c.execute('SELECT * FROM mytable WHERE userid = ? AND recipe = ?', (3, None)).fetchall()
[]

>>> c.execute('SELECT * FROM mytable WHERE userid = ? AND recipe IS ?', (3, None)).fetchall()
[<Row object>, <Row object>]

>>> c.execute('SELECT * FROM mytable WHERE userid = ? AND recipe is ?', (3, 'TestRecipe')).fetchall()
[<Row object>]

IS および IS NOT 演算子は、オペランドの一方または両方が NULL の場合を除き、= および != のように機能します。この場合、両方のオペランドが NULL の場合、IS 演算子は 1 (真) と評価され、IS NOT 演算子は 0 (偽) と評価されます。一方のオペランドが NULL で、もう一方がそうでない場合、IS 演算子は 0 (偽) と評価され、IS NOT 演算子は 1 (真) と評価されます。IS または IS NOT 式を NULL に評価することはできません。演算子 IS および IS NOT の優先順位は = と同じです。

古い MySQL/Mariadb バージョンでは、少なくとも NULL 許容比較演算子は<=>、PostgreSQL ではIS NOT DISTINCT FROM.

PostgreSQL バリアントは、SQL:2003 標準で定義されています。暫定的な互換性のために、Python dict から適切な演算子を挿入してください...

于 2019-12-19T18:04:44.170 に答える