我已經繼承了一個用戶個人信息數據庫,其中包含一個用於個人興趣的列。多個興趣由管道(|)分隔。在一個SQL查詢,我怎麼可以拆分場與該值:2 | 27 | 33 | 14 | 15解析查詢中的SQL字段
看起來像這樣:
2
27
33
14
15
我已經繼承了一個用戶個人信息數據庫,其中包含一個用於個人興趣的列。多個興趣由管道(|)分隔。在一個SQL查詢,我怎麼可以拆分場與該值:2 | 27 | 33 | 14 | 15解析查詢中的SQL字段
看起來像這樣:
2
27
33
14
15
確切語法取決於其dbms
您使用。假設你正在使用MSSQL
這是一般語法
STRING_SPLIT (string , separator)
例如
DECLARE @string_to_be_split NVARCHAR(400) = '2|27|33|14|15'
SELECT value
FROM STRING_SPLIT(@string_to_be_split, '|')
WHERE RTRIM(value) <> '';
編輯 - 可以發誓,我看到的SQL Server
如果不是2016年,幾乎任何分割/解析函數都可以。
選項1 - 以UDF
Declare @YourTable table (ID int,Interests varchar(250))
Insert Into @YourTable values
(1,'2|27|33|14|15')
Select A.ID
,B.*
From @YourTable A
Cross Apply [dbo].[udf-Str-Parse](A.Interests,'|') B
選項2 - 如果沒有一個UDF
Select A.ID
,B.*
From @YourTable A
Cross Apply (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>' + replace((Select replace(A.Interests,'|','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as X
Cross Apply x.nodes('x') AS B(i)
) B
都返回
ID RetSeq RetVal
1 1 2
1 2 27
1 3 33
1 4 14
1 5 15
的UDF如果有興趣
CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10))
Returns Table
As
Return (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>' + replace((Select replace(@String,@Delimiter,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as X
Cross Apply x.nodes('x') AS B(i)
);
--Thanks Shnugo for making this XML safe
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')
--Select * from [dbo].[udf-Str-Parse]('this,is,<test>,for,< & >',',')
在oracle中如何做? –
@TomJMuthirenthi對不起,我近十年沒碰過甲骨文, –
你在使用SQL,和你看了手冊字符串處理函數(我想這是一個VARCHAR字段)?你想如何看待實際的查詢和完整的輸出? – lurker
使用一些像這樣的東西SELECT value FROM STRING_SPLIT(** <> **,'|') –
Naidu