【问题标题】:TSQL Select Statement With A More Specific LIKE具有更具体 LIKE 的 TSQL Select 语句
【发布时间】:2017-03-29 15:08:42
【问题描述】:

我有一个包含患者 ID 的列,该 ID 的末尾有诊所后缀:

[Client Number]
29848393Ch

我运行一个审计脚本来计算这些带有过去的诊所后缀:

SELECT        COUNT(Client.[Client Number]) AS Count
    FROM            Client where [client number] like N'%' + @suffix

我们现在正在使用导致查询出现问题的三位数后缀。

[Client Number]
29848393QCh

有没有办法选择一个传递后缀的计数并让它严格只返回包含 Ch 而不是 QCh 的结果?

【问题讨论】:

  • where right([client number],2) = 'Ch' 或者您可以设置类似于function based indexcomputed column 并使用正确的2 个字符并受其限制。从性能的角度来看,使用 2 个字符的权利的计算列似乎是要走的路。也许 2 人一份,3 人一份……
  • 我认为你应该使用 RIGHT() 而不是 - 应该更快,需要我发布代码吗?
  • 刚刚看到 xQbert 的评论——他是对的。您还可以在某些平台上的 RIGHT(x,2) 上设置索引。
  • 我认为我们还需要检查以确保右侧第三个最多的字符不是“Q”;但我不确定它是否总是 Q 或其他值。请注意,当右侧第三个字符中有 Q 时,计算列可能为 NULL。同样,上下文不够清楚,这就是为什么这是评论而不是答案。

标签: sql sql-server tsql select


【解决方案1】:

这是另一种方法。我不知道数据集的大小,但您可以尝试两种方法,看看哪一种表现更好。

SELECT  COUNT(Client.[Client Number]) AS [Count]
FROM Client
WHERE Client.[Client Number] LIKE '%Ch%'
EXCEPT
SELECT *
FROM Client
WHERE Client.[Client Number] LIKE '%QCh%'

编辑:使用您的替换解决方案,您可以执行类似的操作,找到第一个非数字字符并返回您的后缀。

SUBSTRING(clientID, PATINDEX('%[a-z]%', Client.[Client Number]), LEN(Client.[Client Number]))

【讨论】:

    【解决方案2】:

    感谢大家的所有建议,不幸的是,没有足够灵活的东西,我需要在不知道是否有冲突后缀的情况下搜索后缀,而且有时我需要寻找三个字母的后缀。

    我决定使用替换语句,我已经测试了速度,它有一个边际影响。

    REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE ([client number], '0', ''),'1', ''),'2', ''),'3', ''),'4', ''),'5', ''),'6', ''),'7', ''),'8', ''),'9', '')  = @suffix
    

    可能不是完美的解决方案,但它解决了我的问题,并且对于任何通过的后缀都保持足够的灵活性。

    【讨论】:

    • 这太可怕了。
    【解决方案3】:

    这会查看右边的第三个索引......如果它是一个数字,那么它满足条件,如果它不是一个数字,那么它不满足。因此,不会返回添加的任意数量的字符(即末尾超过 2 个字符的任何字符)。

    where substring([client number],len([client number]) - 2,1) like '[0-9]'

    然后,将其与您的后缀过滤器配对...

    where 
       substring([client number],len([client number]) - 2,1) like '[0-9]'
       and [client number] like N'%' + @suffix
    

    【讨论】:

      【解决方案4】:

      你可以这样写:

      SELECT        COUNT(Client.[Client Number]) AS Count
      FROM          Client 
      WHERE [client number] like N'%[^Q]' + @suffix
      

      编辑:

      SELECT        COUNT(Client.[Client Number]) AS Count
      FROM          Client 
      WHERE [client number] like N'%[^'+ @new_letter + ']' + @suffix
      

      --@new_letter 这里可能是你新添加的字母。

      【讨论】:

      • 问题是有超过 300 个诊所后缀。我需要能够传递@suffix 并让它返回一个计数。
      • 酷,你能解释一下 [^Q] 在做什么吗?
      • 只是说那个位置不是'Q'
      • 如果有帮助,您能接受答案吗?谢谢。
      • 没有更动态的方法吗?我的问题是我可能不知道他们何时添加了另一个后缀。所以有一天我可以检查诊所'Fm',直到他们添加一个后缀为'PFm'的新诊所
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多