使用SQL通过分隔符分割字符串

时间:2018-12-04 05:34:24

标签: sql sql-server sql-server-2012

我在数据库中的表有一列,该列存储以下格式的值。

  

1234#2345#6780

使用分隔符“#”存储四个数字。 由于数据损坏,有些记录具有五位数字。给定行中可能有一个或五个以上的五位数。

  

1234#12345#67895

我正在尝试编写脚本以仅获取那些损坏的记录,但是找不到拆分和检查值的方法。

感谢您的帮助。

我正在使用SQL Server 12.0版本

5 个答案:

答案 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

您现在可以轻松地操作之后的值