【问题标题】:PATINDEX and CHARINDEX returning different answers SQL Server 2008PATINDEX 和 CHARINDEX 返回不同的答案 SQL Server 2008
【发布时间】:2012-10-23 15:58:34
【问题描述】:

我有一个表,我希望找到所有实例,其中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 会不加选择地漏掉一些行?

【问题讨论】:

  • 使用Right( icd, 1 ) = '0'可能更清晰。
  • 它并不性感,但它肯定更简洁:)

标签: sql-server-2008 tsql


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    PATINDEX 不会在字符串中返回第一个“0”,因此如果字符串有多个零,PATINDEX('%0%',icd) = LEN(icd) 将是假的,即使末尾还有另一个零??

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-24
        • 2015-05-18
        • 1970-01-01
        相关资源
        最近更新 更多