PATINDEX和CHARINDEX返回不同的答案SQL Server 2008

时间:2012-10-23 15:58:34

标签: sql-server-2008 tsql

我有一个表格,我希望找到0是字符串字段中 last 字符的所有实例。我通过使用两种方法尝试了这一点,它们各自返回不同的结果。

第一个查询似乎实际上返回了正确答案

select * from icd
    where CHARINDEX('0',icd,LEN(icd)) =LEN(icd) 

这个没有得到所有的答案

select * from icd
    where PATINDEX('%0%',icd) = LEN(icd)

使用

select t.ICD as theCharIndex,x.ICD as thePatIndex from
(

select * from icd
    where CHARINDEX('0',icd,LEN(icd)) =LEN(icd) 
) t
left join
(
select * from icd
    where PATINDEX('%0%',icd) = LEN(icd)
) x on x.ICD=t.ICD
where x.ICD is null

我发现CHARINDEX选择的PATINDEX数据集没有update icd set ICD=RTRIM(icd) 。我甚至做过

PATINDEX

为什么{{1}}不分青红皂白地遗漏了一些行?

3 个答案:

答案 0 :(得分:4)

因为你在结束前的某个地方有0。 将PATINDEX('%0%',icd)更改为PATINDEX('%0',icd)

答案 1 :(得分:2)

不会PATINDEX在字符串中返回FIRST“0”,因此如果字符串有多个零PATINDEX('%0%',icd) = LEN(icd),那么即使最后还有一个零,也会是假的吗?< / p>

答案 2 :(得分:1)

很难说有一些数据,但我thiknk是因为你告诉CHARINDEX从字符串的最后位置开始,所以它只会考虑最后一个字符(这似乎是你想要做的)但是PATINDEX是lloking进入所有的字符串。

仅供参考,我认为用SUBSTRING函数实现你想要的效果会更好

where SUBSTRING(icd, len(icd),1)