在varchar字段中查找数值

时间:2018-06-11 15:24:20

标签: sql sql-server tsql

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

我正在寻找仅查询格式为此数字(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地方......

的结果

2 个答案:

答案 0 :(得分:1)

我会这样做

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

更新(2018年6月12日)

在阅读@EzLo的评论后,我意识到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

结果是:

enter image description here

答案 1 :(得分: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 '%-%-%-%' 

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