我很困惑为什么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
答案 0 :(得分:5)
position(needle in haystack)
函数将返回:
needle
不为NULL且不在haystack
且haystack
不为空,则为零。needle
位于haystack
,其中一个是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 | | |
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 NULL
和D.comment
不包含'Previous subjectid:'
时,才会为真。
所以这两个条件完全不同。
答案 1 :(得分:1)
NULL实际上是无值。 0是位数据池。
这就是区别。