SQL 只取列中的数值
SQL take just the numeric values from a column
我在一列中有以下数据:
aud_344266_jayde_adams
int_343581_jtou_s5_ep1
of_344289_geordie_s21_rig_c
soft_343726_24hrpc_s4_norbiton
on_334195_sas_s5_1007_1008
我只想return以下内容:
344266
343581
344289
343726
334195
如您所知,我想要 return 的号码中有一个模式。它们前后必须有下划线,并且长度也是6个字符。
有没有办法在 SQL 服务器中做到这一点?
你可以使用 left、right 和 charindex 函数
示例:
declare @row as varchar(100) = 'aud_344266_jayde_adams'
select @row, right(@row, len(@row)-charindex('_',@row)), left(right(@row, len(@row)-charindex('_',@row)),-1 + charindex('_',right(@row, len(@row)-charindex('_',@row))))
对于你的table你做的:
select left(right(_Column, len(_Column)-charindex('_',_Column)),-1 + charindex('_',right(_Column, len(_Column)-charindex('_',_Column))))
From Tbl
对于您的示例数据,这有效:
select left(stuff(t.col, 1, patindex('%[_][0-9][0-9][0-9][0-9][0-9][0-9][_]%', t.col), ''), 6)
或者更简单:
select substring(t.col, patindex('%[_][0-9][0-9][0-9][0-9][0-9][0-9][_]%', t.col) + 1, 6)
Here 是一个 db<>fiddle.
APPLY
是你的朋友。
-- Sample Data
DECLARE @yourtable TABLE (SomeString VARCHAR(100));
INSERT @yourtable (SomeString) VALUES
('aud_344266_jayde_adams'),('int_343581_jtou_s5_ep1'),('of_344289_geordie_s21_rig_c'),
('soft_343726_24hrpc_s4_norbiton'),('on_334195_sas_s5_1007_1008');
-- Solution
SELECT TheNumber = SUBSTRING(t.SomeString,d1.Pos,d2.Pos-d1.Pos)
FROM @yourtable AS t
CROSS APPLY (VALUES(CHARINDEX('_',t.SomeString)+1)) AS d1(Pos)
CROSS APPLY (VALUES(CHARINDEX('_',t.SomeString,d1.Pos))) AS d2(Pos);
Returns:
TheNumber
----------
344266
343581
344289
343726
334195
可以使用SUBSTRING combine with CHARINDEX来实现
select substring(value, CHARINDEX('_', value) + 1, 6)
from TempTable
输出
344266
343581
344289
343726
334195
我在一列中有以下数据:
aud_344266_jayde_adams
int_343581_jtou_s5_ep1
of_344289_geordie_s21_rig_c
soft_343726_24hrpc_s4_norbiton
on_334195_sas_s5_1007_1008
我只想return以下内容:
344266
343581
344289
343726
334195
如您所知,我想要 return 的号码中有一个模式。它们前后必须有下划线,并且长度也是6个字符。
有没有办法在 SQL 服务器中做到这一点?
你可以使用 left、right 和 charindex 函数
示例:
declare @row as varchar(100) = 'aud_344266_jayde_adams'
select @row, right(@row, len(@row)-charindex('_',@row)), left(right(@row, len(@row)-charindex('_',@row)),-1 + charindex('_',right(@row, len(@row)-charindex('_',@row))))
对于你的table你做的:
select left(right(_Column, len(_Column)-charindex('_',_Column)),-1 + charindex('_',right(_Column, len(_Column)-charindex('_',_Column))))
From Tbl
对于您的示例数据,这有效:
select left(stuff(t.col, 1, patindex('%[_][0-9][0-9][0-9][0-9][0-9][0-9][_]%', t.col), ''), 6)
或者更简单:
select substring(t.col, patindex('%[_][0-9][0-9][0-9][0-9][0-9][0-9][_]%', t.col) + 1, 6)
Here 是一个 db<>fiddle.
APPLY
是你的朋友。
-- Sample Data
DECLARE @yourtable TABLE (SomeString VARCHAR(100));
INSERT @yourtable (SomeString) VALUES
('aud_344266_jayde_adams'),('int_343581_jtou_s5_ep1'),('of_344289_geordie_s21_rig_c'),
('soft_343726_24hrpc_s4_norbiton'),('on_334195_sas_s5_1007_1008');
-- Solution
SELECT TheNumber = SUBSTRING(t.SomeString,d1.Pos,d2.Pos-d1.Pos)
FROM @yourtable AS t
CROSS APPLY (VALUES(CHARINDEX('_',t.SomeString)+1)) AS d1(Pos)
CROSS APPLY (VALUES(CHARINDEX('_',t.SomeString,d1.Pos))) AS d2(Pos);
Returns:
TheNumber
----------
344266
343581
344289
343726
334195
可以使用SUBSTRING combine with CHARINDEX来实现
select substring(value, CHARINDEX('_', value) + 1, 6)
from TempTable
输出
344266
343581
344289
343726
334195