2016-08-08 4 views
0

私はNOT NULL ''> <対間違いについてたくさん読みましたPostgresqlのNULL AND <> 'NOT' 対NULL OR <>はありません ''

それはにあったために私が見つけた最良の説明:

述べ

https://www.postgresql.org/message-id/[email protected]

NULL質問は、このように何 答えはありません、まだ回答されていないことを意味、あなたは本当に が言うことができないので、それが提供されるとの答えがあるかもしれません答えは空です。空の場合は答えが与えられており、答えが空の場合は となります。私は有効な郵便番号のみの結果をフィルタ処理しようとしていた、働いているテーブルの場合

(郵便番号は、この特定のテーブルのVARCHARです)、私は次のことを試してみました:

SELECT postcode FROM customer_table_1 
WHERE postcode IS NOT NULL OR postcode <> ''; 

しかし、これは私の結果にいくつかの空白のポストコードを与えます。

SELECT postcode FROM customer_table_1 
WHERE postcode <>''; 

は結果だけで有効な郵便番号を与えるのに対し、このダウンを破る...

SELECT postcode FROM customer_table_1 
WHERE postcode IS NOT NULL; 

は、いくつかの空白の郵便番号を提供します。したがって、クエリのIS NOT NULL部分は、私が思っていたことをしていません。

より複雑なクエリの一部として、私が以前に使用しています

SELECT postcode FROM customer_table_1 
WHERE postcode IS NOT NULL AND postcode <> ''; 
をし、望ましい結果を達成しました。しかし、私はいつもそれが私が(つまり空でないNULLまたはNOT文字列で)有効な郵便番号を持つすべてのレコードを探していますので

SELECT postcode FROM customer_table_1 
WHERE postcode IS NOT NULL OR postcode <> ''; 

をする必要がありますこれらのではなく、OR文で接続するべきではないと思っていますそして?私はNULLと空の文字列の両方であるポストコードを探しているわけではありません。

愚かな質問の場合は、ANDを使用しても私には論理的ではないように見えます。結果の背後にあるプロセスを理解していないと、盲目的に何かをしたくありません。私はNOT NULLと<の違いを完全に理解していると思っていましたが、Postgresが関連するほとんどのものと同じように、私は実際には分かりません。

+0

'arg!= val1またはarg!= val2'は、' arg'が 'null'または' val1 = val2'を除いて常に真です。 'postcode'がヌルでない場合、' or'演算子の2番目の式無視することができます。だからあなたは 'と'を使うことを推測します。または 'not(postcodeはヌルかpostcode = '')です。さらに別のアプローチ: 'nullif(postcode、 '')がヌルでないか' coalesce(postcode、 '')<> '' 'しかし、これはインデックスをチューニングする必要があります。 – Abelisto

答えて

0

あなたはブール論理の基本であるDe Morgan's Lawを知っているから利益を得るであろう。この場合

、あなたの状態はあなたのように表現するものではありません。

(NOT NULL) OR (NOT EMPTY) 

が、実際には次のとおりです。実際にはド・モルガンに応じて拡大

NOT (NULL OR EMPTY) 

は次のようになります。

(NOT NULL) AND (NOT EMPTY) 

したがって、なぜANDが正しい(そして実際には論理的な)演算子であるか。

+0

Alnitakありがとう、本当に私のためにそれをクリアしました。他の人のおかげで、私は今、私の頭の中でそれを取り巻いていると思う! – mmTmmR

2

それらの少なくとも1つがtrueあるときor 2つの式は、結果がtrue次のようになります。

select true or false; 
?column? 
---------- 
t 

あなたのケースではpostcodeis not null結果はtrueになりますいつでも。空postcodeis not nullは、それが返されます。

select 
    '' is not null, -- empty is not null 
    '' <> '',  -- false 
    '' is not null or '' <> '' -- (true or false) is true 
; 
?column? | ?column? | ?column? 
----------+----------+---------- 
t  | f  | t 
関連する問題