我的数据包含以下字符串:
Hello | World | 40
Hi | World | 24244
One | Two | 27
This | That | 84f
Yes | No | 456gf
The | Test|54
现在我需要编写查询以仅获取那些行,其中只有最后的数字,过滤那些带有字符的行。上述结果如下:
Hello | World | 40
Hi | World | 24244
One | Two | 27
The | Test|54
我尝试了几种使用通配符的方法,但没有成功。
TB LIKE '%_|_[0-9]%' OR TB LIKE '%_|[0-9]%'
AND TB NOT LIKE '%[0-9][^a-z]%'
等等。显然,例如此查询还返回包含456gf和84f的行。
答案 0 :(得分:0)
我想你差不多了。 我不确定你的模式中是否有_或空格。 我认为主要的问题是“NOT ^”技巧没有按预期工作。你真的只想把它应用到最后一节。
试试这个你的WHERE ......
LTRIM(REVERSE(SUBSTRING(REVERSE(TB),1,CHARINDEX('|',REVERSE(TB)) - 1))) NOT LIKE '%[^0-9]%'
答案 1 :(得分:0)
尝试使用cte,
declare @t table (field1 varchar(20),field2 varchar(20),field3 varchar(20) )
insert into @t
( field1, field2, field3 )
values ('Hello','World','40')
,('Hi', 'World','24244')
,('One','Two','27')
,('This', 'That','84f')
,('Yes','No','456gf')
,('The','Test','54')
;with cte as(
select *, CASE ISNUMERIC(field3) WHEN 1 THEN CAST(field3 AS int) ELSE null end as Field4
from @t)
SELECT cte.field1,cte.field2,cte.field3 FROM cte
where field4 is not null
答案 2 :(得分:0)
使用isnumeric的try_parse,因为它比ISNUMERIC更快。
declare @t table (field1 varchar(20),field2 varchar(20),TB varchar(20) )
insert into @t
( field1, field2, TB )
values ('Hello','World','40')
,('Hi', 'World','24244')
,('One','Two','27')
,('This', 'That','84f')
,('Yes','No','456gf')
,('The','Test','54')
;
Select * from @t
WHERE TRY_PARSE(Tb as int) IS NOT NULL
答案 3 :(得分:0)
这应符合您的要求(该表名为t,列c):
VARCHAR2
内部charindex select * from t where isnumeric(substring(c, charindex('|', c, charindex('|', c, 0) + 1) + 1, len(c))) = 1
找到第一个管道符号的位置,外部符号找到第二个管道符号的位置,因为它在第一个管道符号后面开始搜索。之后,isnumeric检查余数是否确实是一个数字。测试:
charindex('|', c, 0)