为什么Postgres position()函数给出不同的结果?

时间:2011-12-19 22:36:14

标签: postgresql

我很困惑为什么Postgresql位置函数为看似简单的测试提供了不同的结果。

这是查询#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

2 个答案:

答案 0 :(得分:5)

position(needle in haystack)函数将返回:

  • 如果needle不为NULL且不在haystackhaystack不为空,则为零。
  • 如果needle位于haystack,其中一个是haystack的开头,则为正值。
  • 如果needlehaystack为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 |    |    |   

n1n3下的空白点是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:'时,

才会为真。

所以这两个条件完全不同。

答案 1 :(得分:1)

NULL实际上是无值。 0是位数据池。

这就是区别。