2016-06-18 4 views
0

私は自分自身のようなクエリを書く見つけるしばしばので、他人にnullを空になっている列を/比較することはできません知っている:これは、私はいつもそれをやった方法ですが、私は興味比較している列にヌル/空の値がある場合は、常にWHEREで合体を使用する必要がありますか?

WHERE field2 <> '' AND coalesce(field1, '') <> coalesce(field2, '') 

null /空の値を処理するためのより良い方法があれば。また、私はなぜNULL <comparison operator> anything is UNKNOWNの最初の場所に興味があります。

+0

http://www.w3schools.com/sql/sql_isnull.asp –

+1

'フィールド2 <> '' ANDフィールド1のIS DISTINCT FROM field2'(DISTINCT FROMはpostgres拡張です) – wildplasser

+0

COALESCEは、値を持たない値ではなく、値を比較することを容易にします。 3VLの理由は、https://www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-three-valued-logic/とhttps://en.wikipediaを参照してください。 .org/wiki/Null_(SQL)を使用して、背景のビットを作成します。 – reaanb

答えて

1

いいえ。COALESCE()を使用すると、一般的にインデックスが使用されなくなります。ブール論理を使用する同等の構文は煩雑になる。

最善の解決策は、IS DISTINCT FROMを使用することです:

where field1 is distinct from field2 

組み込み演算子を使用することにより、Postgresは、クエリを最適化することができ、より良い変化があります。 IS DISTINCT FROMは、documentationで説明されているANSI標準構文です。

+0

合体によってインデックスが使用されないのはなぜですか? – m0meni

+1

@ AR7。 。 。ほぼすべてのデータベースで、列のほぼすべての機能が索引の使用を防ぎます。ここには例外がありますが、一般的に、関数はインデックスの使用を防ぎます。 –

1

小さなノート:'' <> NULLがNULLであるため、(COALESCE(t1.val, '') <> COALESCE(t2.val, ''))(t1.val IS DISTINCT FROM t2.val)ための結果は、同じではありません。例の真理値表:

CREATE TABLE three 
     (id serial not null primary key 
     , val text 
     ); 
insert into three(val) VALUES(NULL), ('') , ('a') , ('b'); 



SELECT COALESCE(t1.val, '<NULL>') AS t1val  -- <NULL> for readability 
     ,COALESCE(t2.val, '<NULL>') AS t2val -- <NULL> for readability 
     , (t1.val <> t2.val) AS is_ne 
     , (COALESCE(t1.val, '') <> COALESCE(t2.val, '')) AS coa_is_ne 
     , (t1.val IS DISTINCT FROM t2.val) AS is_distinct 
FROM three t1, three t2 
ORDER BY t1.val,t2.val 
     ; 

結果の真理値表:

t1val | t2val | is_ne | coa_is_ne | is_distinct 
--------+--------+-------+-----------+------------- 
     |  | f  | f   | f 
     | a  | t  | t   | t 
     | b  | t  | t   | t 
     | <NULL> |  | f   | t   # <<-- here 
a  |  | t  | t   | t 
a  | a  | f  | f   | f 
a  | b  | t  | t   | t 
a  | <NULL> |  | t   | t 
b  |  | t  | t   | t 
b  | a  | t  | t   | t 
b  | b  | f  | f   | f 
b  | <NULL> |  | t   | t 
<NULL> |  |  | f   | t   # <<-- and here 
<NULL> | a  |  | t   | t 
<NULL> | b  |  | t   | t 
<NULL> | <NULL> |  | f   | f 
(16 rows) 
関連する問題