我在列中存储了文本;在数百行中。文本为VARCHAR
,在500-5000个字符中的任何位置。我只想返回2个括号之间的数字。
所以这是一个示例
abcd(22135)
hhgygas(52142)dijijijs
whatisthis(33234) i have no idea (22342)
,结果应为
22135
52142
33234
22342
您可以尝试使用substring功能仅提取数字。尝试这样的事情:
DECLARE @x VARCHAR(max);
SET @x = 'lmfasdfa(1234567)asdfasdfaff'
SELECT
SubString(@x,CHARINDEX('(',@x)+1,CHARINDEX(')',@x)-CHARINDEX('(',@x)-1) AS numbers1
输出看起来像:
1234567
您可以使用udf,并使用十字架来获取所有值。
create table tbl (txt varchar(max)); insert into tbl values ('abcd(22135)'), ('hhgygas(52142)dijijijs'), ('whatisthis(33234) i have no idea (22342)'); GO
create function dbo.getValues(@txt varchar(max)) returns @t table (val varchar(20)) as begin declare @p1 int, @p2 int; set @p1 = 0; set @p2 = 0; while charindex('(', @txt, @p2) <> 0 begin set @p1 = charindex('(', @txt, @p2); if @p1 = 0 return; set @p2 = charindex(')', @txt, @p1); if @p2 = 0 return; insert into @t values(substring(@txt, @p1 + 1, @p2 - @p1 - 1)); end return; end GO
select f.val from tbl cross apply dbo.getValues(tbl.txt) f GO
|瓦尔||:---- ||22135 ||52142 ||33234 ||22342 |
dbfiddle在这里
获取ngrams2b的副本,您可以做到这一点:
-- Sample data
DECLARE @table TABLE (someid int identity, col1 varchar(max));
INSERT @table VALUES
('abcd(22135)'),
('hhgygas(52142)dijijijs'),
('whatisthis(33234) i have no idea (22342)'),
('nothing to see here');
-- Solution
SELECT
t.someid,
numbers =
substring(t.col1, position+1,nullif(charindex(')', t.col1, position+1),0)-position-1)
FROM @table t
CROSS APPLY dbo.ngrams2b(t.col1,1)
WHERE token = '(';
结果
someid numbers
----------- --------
1 22135
2 52142
3 33234
3 22342