2011-12-19 8 views
0

私は、Postgresqlの位置機能が、簡単なテストのような結果をもたらす理由について戸惑っています。ここでなぜPostgresのposition()関数は異なる結果を出しますか?

は、クエリ#1:次に、ここで246

の結果を返します

SELECT count(*) 
FROM 
    dnasample D, ibg_studies ST, subjects S 
WHERE 
    D.studyindex=ST.studyindex 
    AND ST.studyabrv='CONGER' 
    AND D.subjectidkey=S.id 
    AND D.projectindex IS NULL 
    AND POSITION('Previous subjectid:' in D.comment) IS NULL 

がクエリ#2である。これらは、このような返す理由

SELECT count(*) 
FROM 
    dnasample D, ibg_studies ST, subjects S 
WHERE 
    D.studyindex=ST.studyindex 
    AND ST.studyabrv='CONGER' 
    AND D.subjectidkey=S.id 
    AND D.projectindex IS NULL 
    AND POSITION('Previous subjectid:' in D.comment)=0 

私は表示されません異なる結果は?

私は --Rick

答えて

5

position(needle in haystack)関数が返されます:

  • ゼロneedleがNULLではないとないhaystackhaystackにはNULLでない場合。
  • needlehaystackにある場合は正の値で、1つはhaystackの先頭です。
  • needleまたはhaystackがNULLの場合はNULLです。例えば

=> select position('a' in 'a') as a, 
      position('a' in 'b') as b, 
      position('a' in null) as n1, 
      position(null in 'a') as n2, 
      position(null in null) as n3; 
a | b | n1 | n2 | n3 
---+---+----+----+---- 
1 | 0 | | | 

n3スルーn1下の空のスポットがNULL値であること。

ので、この条件:この一方

D.comment IS NULL 

'Previous subjectid:'が含まれていないとだけD.comment IS NOT NULL場合とD.comment場合

POSITION('Previous subjectid:' in D.comment)=0 

がtrueになります

POSITION('Previous subjectid:' in D.comment) IS NULL 

は同等です。

したがって、2つの条件は全く異なります。

+0

ありがとう;私は今の違いを理解しています。素晴らしい答え。 – rixter

+0

この質問は回答済みです...もう必要ありません! – rixter

1

NULLがあり、事前に

感謝をゼロとヌル文字列との違いを明確にするためにはPostgresのマニュアルを読んでみましたが、そこではない多くの幸運はまだ...しました実際には値なしです。 0はビットデータのプールです。

これは違いです。

+0

ありがとうございます。それは助ける... – rixter

関連する問題