【问题标题】:find if there is a 6 digit number within a string查找字符串中是否有 6 位数字
【发布时间】:2014-10-14 14:26:11
【问题描述】:

如果查询包含等于 6 位数字的子字符串,您建议如何在 Sql Server 2010/2012 中查找?

例如“agh123456 dfsdfdf”符合要求

x123 ddd456”6位不连续,不符合要求

lm123”不符合要求,因为只找到了 3 位数字(在所需的 6 位之外)

到目前为止我遇到的问题:SUBSTRING 作为函数需要参数(大概是数字开始的位置,这是随机的) 而 PATINDEX 返回一个模式在字符串中的位置,但我们不知道确切的模式(它可以是任何 6 位数字)

任何指针或建议,非常感谢。

谢谢

【问题讨论】:

  • 我只是想用字符或 & 之类的符号替换数字,然后检查字符串中是否有 &&&&&&。如果有更优雅的解决方案,请告诉我
  • 顺便问一下,你知道如何在一个“替换”函数中一次替换所有数字(所以我不必为每个数字使用 10 个“替换”)吗?谢谢
  • 是否要从输出中删除 6 位数字?
  • 如何找到6个或更多的数字?

标签: sql sql-server


【解决方案1】:

您可以使用LIKE 运算符:

SELECT *
FROM MyTable
WHERE Mycolumn LIKE '%[0-9][0-9][0-9][0-9][0-9][0-9]%'

【讨论】:

  • @sgeddes 哈哈,不过只有几秒钟!
  • 我认为这将匹配 7 位而不是 6 位。
  • @AnkitBajpai 好地方!显然我对 Ctrl-V 太渴望了 :)
  • @DavidG 我在你回答 Ankit 时纠正了 :) Hoops 我看了历史,我犯了错误。我的错,对不起
  • 这将匹配至少 6 位数字的数字。如果用户正好需要 6 位数字,则需要更改查询。
【解决方案2】:

即使这样也应该有效.. 考虑到您没有这样的字符串

abc123 abc123456

试试这个

DECLARE @str varchar(max) = 'abcxyz123456'

SELECT ISNUMERIC(SUBSTRING(@str,(SELECT PATINDEX('%[0-9]%',@str)),6))

【讨论】:

    【解决方案3】:

    如果要选择表格中的所有行并屏蔽每行中的前6位子字符串:

    DECLARE @mask varchar(max) = '######'
    DECLARE @pattern varchar(max) = '%'+REPLACE(@mask,'#','[0-9]')+'%'
    
    SELECT
      ISNULL(STUFF(col1,PATINDEX(@pattern,col1),LEN(@mask),@mask),col1)
    FROM Table1
    

    【讨论】:

      猜你喜欢
      • 2019-03-10
      • 2012-08-16
      • 1970-01-01
      • 2012-02-02
      • 2018-08-02
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      相关资源
      最近更新 更多