我在数据库中的表有一列,该列存储以下格式的值。
1234#2345#6780
使用分隔符“#”存储四个数字。 由于数据损坏,有些记录具有五位数字。给定行中可能有一个或五个以上的五位数。
1234#12345#67895
我正在尝试编写脚本以仅获取那些损坏的记录,但是找不到拆分和检查值的方法。
感谢您的帮助。
我正在使用SQL Server 12.0版本
答案 0 :(得分:2)
您可以使用此功能拆分值:
CREATE FUNCTION [dbo].[fnSplit]
(@sInputList VARCHAR(8000) -- List of delimited items
, @sDelimiter VARCHAR(8000) = '#' -- delimiter that separates items
)
RETURNS @List TABLE (item VARCHAR(8000))
BEGIN
DECLARE @sItem VARCHAR(8000)
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
BEGIN
SELECT
@sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
@sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))
IF LEN(@sItem) > 0
INSERT INTO @List SELECT @sItem as item
END
IF LEN(@sInputList) > 0
INSERT INTO @List SELECT @sInputList as item -- Put the last item in
RETURN
END
然后询问结果
答案 1 :(得分:1)
这将起作用patindex与orcale的regexp_like()等效:
select * from table_name where not PATINDEX ('^[0-9]{4}(#){1}[0-9]{4}(#){1}[0-9]
{4}$',col_name) !=0;
答案 2 :(得分:1)
您可以使用XML节点在2016版之前拆分字符串。
BrowserComponent
您得到的输出,我添加了此ID列以标识哪一行可能包含4个以上的字符。
Create table Xmltest(ID int, numbers nvarchar(max))
insert into Xmltest values (1, '1234#12345#67895')
select ID, N.value('.', 'varchar(255)') as xmlValue
from (
select ID ,
cast(('<w>' + replace(numbers,'#','</w><w>') + '</w>') as xml) as xmlValue
from Xmltest
) as z
cross apply xmlValue.nodes ('//w') as split(N)
要检查您有超过4个字符的位置,可以执行以下操作:
ID xmlValue
1 1234
1 12345
1 67895
您得到的输出:
select ID, N.value('.', 'varchar(255)') as xmlValue
from (
select ID ,
cast(('<w>' + replace(numbers,'#','</w><w>') + '</w>') as xml) as xmlValue
from Xmltest
) as z
cross apply xmlValue.nodes ('//w') as split(N)
where len(N.value('.', 'varchar(255)')) > 4
答案 3 :(得分:1)
您可以使用它。它返回长度大于4的任何数字行。
SELECT * FROM SampleData
WHERE data LIKE '%[0-9][0-9][0-9][0-9][0-9]%'
答案 4 :(得分:0)
SQL Server (starting with 2016)
您可以使用SQL的内置函数拆分字符串。
样本:
DECLARE @Text VARCHAR(100) = '1234#12345#67895'
SELECT * FROM STRING_SPLIT(@Text,'#')
结果:
value
----
123
4456
78902
您现在可以轻松地操作之后的值