2011-12-19 114 views
0

我很困惑,爲什麼Postgresql定位函數爲什麼看起來是一個簡單的測試給出了不同的結果。爲什麼Postgres position()函數會給出不同的結果?

這裏查詢#1:

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 

返回的246

然後在這裏一個結果是查詢#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 

我不明白爲什麼這回這樣的不同的結果?

我試着讀Postgres的文件,以澄清區別零和空字符串,但沒有多少運氣還存在之間...

由於提前, --Rick

回答

5

position(needle in haystack)函數將返回:

  • 零,如果needle不爲NULL,而不是在haystackhaystack不爲NULL。
  • 如果needlehaystack中爲正值,其中一個爲haystack的開頭。
  • NULL如果needlehaystack爲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 | | | 

n1下空斑通過n3是NULL值。

所以這個條件:

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

等同於:

D.comment IS NULL 

,而這一點:

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

爲真當且僅當D.comment IS NOT NULLD.comment不含'Previous subjectid:'

所以這兩個條件是完全不同的。

+0

謝謝;我明白現在的差異;很好的答案。 – rixter 2011-12-20 23:14:16

+0

已回答此問題...不再需要! – rixter 2011-12-20 23:15:29

1

是NULL實際上一個沒有價值。 0是一個位數據池。

這是區別。

+0

謝謝;這有助於... – rixter 2011-12-19 23:03:40

相關問題