【问题标题】:Finding numeric values in varchar field在 varchar 字段中查找数值
【发布时间】:2018-06-13 00:03:11
【问题描述】:

抱歉,如果这是重复的,我无法在已回答的问题中找到我要查找的内容。

我希望仅查询具有以下格式的字段的记录:数字 (0-9)、连字符 (-)、数字 (0-9)、连字符 (-)、数字 (0-9)。这是我尝试过的:

    SELECT *
    FROM TABLE_1
    WHERE LTRIM(RTRIM(LOC_NAME)) LIKE '[0-9]-[0-9]-[0-9]'

我要查找的结果集是 123456-123-1234。 起初我以为他们可能有空格,所以我修剪了该字段,但 ABOVE 查询仍然没有显示任何结果。 BELOW 查询返回它们,但还有其他结果:

    SELECT *
    FROM TABLE_1
    WHERE LOC_NAME LIKE '%[0-9]-[0-9]%'

但我会得到类似 1-2-3 Place...的结果...

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?
  • 是每个连字符常量之间的位数。这是个大问题
  • SQL Server 没有像样的正则表达式函数,您可能希望用连字符分割并分别验证每个数字。你需要这个正则表达式模式:[0-9]+-[0-9]+-[0-9]+
  • DhruvJoshi- 我使用的是 SQL Server 2012 scsimon- 是的,它们应该是常量

标签: sql sql-server tsql


【解决方案1】:

我认为这是你想要的:

SELECT *
FROM TABLE_1
WHERE LTRIM(RTRIM(LOC_NAME)) NOT LIKE '%[^-0-9]%'

这会检查该字段是否没有非连字符或非数字。

如果你特别想要两个连字符,用数字分隔,那么:

WHERE LTRIM(RTRIM(LOC_NAME)) NOT LIKE '%[^-0-9]%' AND
      LTRIM(RTRIM(LOC_NAME)) LIKE '[0-9]%-[0-9]%-[0-9]%' AND
      LTRIM(RTRIM(LOC_NAME)) NOT LIKE '%-%-%-%' 

第二种模式在名称的所有三个部分中至少需要两个连字符和一个数字。第三个禁止使用三个连字符。

【讨论】:

    【解决方案2】:

    我会这样做

    select *
    from table_1
    where isnumeric(replace(LOC_NAME, '-','')) = 1;
    

    更新(2018 年 6 月 12 日)

    在阅读了@EzLo 的 cmets 后,我意识到 OP 可能只需要两个连字符(不多也不少),所以我用下面的演示代码更新我的答案

    create table #t (LOC_NAME varchar(100));
    go
    
    insert into #t (loc_name) 
    values ('a12-b12-123'), ('123456-123-11'), ('123-123-123-123')
    go
    
    select *
    from #t --table_1
    where isnumeric(replace(LOC_NAME, '-','')) = 1
    and len(loc_name)-len(replace(LOC_NAME, '-',''))=2
    

    结果是:

    【讨论】:

    • 这将返回超过 3 个连字符的不正确匹配。
    • 对我来说听起来很奇怪,@EzLo,你能举个例子吗?对我来说,你有多少连字符并不重要,因为所有连字符都会被 [replace] 函数删除。
    • 哦,我猜,@EzLo 你指的是戈登的回答。 :-)
    • OP 想要验证带有 3 个连字符的模式,不多不少
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    相关资源
    最近更新 更多