【问题标题】:how to compare string in SQL without using LIKE如何在不使用 LIKE 的情况下比较 SQL 中的字符串
【发布时间】:2016-01-17 18:02:22
【问题描述】:

我正在使用如下所示的 SQL 查询来比较 AMCcode。但是,如果我使用 LIKE 运算符比较 AMCcode '1',它会将所有条目与 AMCcode 1、10、11、12、13 进行比较。 .. 19, 21,31.... 等等。但我只想将 AMCcode 与 1 匹配。请建议我该怎么做。代码如下:

ISNULL(CONVERT(VARCHAR(10),PM.PA_AMCCode), '') like          
  (        
   CASE         
    WHEN @AMCCode IS NULL THEN '%'        
    ELSE '%'+@AMCCode+ '%'        
   END        
  )    

这是代码的一部分,我需要将 LIKE 运算符替换为任何其他运算符,当我想搜索 1 的 AMCcode 时,AMCcode 将为 1,而不是全部 10、11、12..... 请帮助

【问题讨论】:

  • 请澄清您的问题。如果您需要完全匹配 - 那么为什么要使用 like 运算符而不是相等?
  • 我不肯定,但您可能想看看 PATINDEX 或 CHARINDEX,尽管我相信它们只返回一个 INT,即您的模式开始的位置。
  • 是的,我需要完全匹配......我使用了相等,但它没有显示任何记录.. 但有记录
  • @gautamshetty 您能否发布您尝试使用相等匹配的查询。连同实际代码的样例。如果您包括样本数据和预期结果。帮助您解决问题要容易得多。

标签: sql sql-server tsql string-matching


【解决方案1】:

我认为您正在寻找这样的东西:

where ',' + cast(PM.PA_AMCCode as varchar(255)) + ',' like '%,' + @AMCCodes + ',%'

这包括比较中的分隔符。

请注意,更好的方法是拆分字符串并使用join,如下所示:

select t.*
from t cross apply
     (select cast(code as int) as code
      from dbo.split(@AMCCodes, ',') s(code)
     ) s
where t.AMCCode = s.code;

这样更好,因为在某些情况下,此版本可以使用AMCCode 上的索引。

【讨论】:

    【解决方案2】:

    如果您想完全匹配该值,则无需在查询中使用 '%'。你可以像下面这样使用

    ISNULL(CONVERT(VARCHAR(10),PM.PA_AMCCode), '') like          
      (        
       CASE         
        WHEN @AMCCode IS NULL THEN '%'        
        ELSE @AMCCode        
       END        
      ) 
    

    可能你可以删除case语句和查询

    ISNULL(CONVERT(VARCHAR(10),PM.PA_AMCCode), '') like @AMCCode
    

    【讨论】:

      猜你喜欢
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2013-12-11
      相关资源
      最近更新 更多