[英]How to get comma separated values into rows with having multiple comma separated value inside brackets
我有一個像這樣的字符串:
a,b,c(a,b,c),d,e,L(e,d,g)
我希望它像這樣的行:
1. a
2. b
3. c(a,b,c)
4. d
5. e
6. L(e,d,g)
在 MSSQL 查詢中。
那么您可以使用 UNION 或創建表並在那里插入此類數據。
聯合示例
SELECT 'a' FROM dual
UNION
SELECT 'b' FROM dual
UNION
SELECT 'c(a,b,c)' FROM dual
等等。
@編輯:
了解,根據評論,您可以在這里查看答案: https://stackoverflow.com/a/5493616/8416043
我不會在這里乘以它。
祝你好運
IF OBJECT_ID('tempdb..#Data')IS NOT NULL
DROP TABLE #Data
CREATE TABLE #Data
(
ID INT IDENTITY(1,1),
String VARCHAR(MAX)
)
INSERT #Data SELECT 'a,b,c(a,b,c),d,e,L(e,d,g)'
UPDATE T SET String=REPLACE(REPLACE(String,'(','('''),')',''')') FROM #Data T
IF OBJECT_ID('tempdb..#T')IS NOT NULL
DROP TABLE #T
DECLARE @FieldSeparator VARCHAR(10)='(',@FieldSeparator1 VARCHAR(10)=')'
;WITH CTE AS
(
SELECT
ID,
LEFT(String, CHARINDEX(@FieldSeparator, String + @FieldSeparator) - 1) DataItem,
STUFF(String, 1, CHARINDEX(@FieldSeparator, String + @FieldSeparator), '') String
FROM #Data
UNION all
SELECT
ID,
LEFT(String, CHARINDEX(@FieldSeparator, String + @FieldSeparator) - 1),
STUFF(String, 1, CHARINDEX(@FieldSeparator, String + @FieldSeparator), '')
FROM CTE
WHERE String > ''
)
SELECT
ID,
DataItem AS String
INTO #T
FROM CTE WHERE CHARINDEX(@FieldSeparator1,DataItem)>0
ORDER BY ID
--SELECT * FROM #T
IF OBJECT_ID('tempdb..#T1')IS NOT NULL
DROP TABLE #T1
;WITH CTE AS
(
SELECT
ID,
LEFT(String, CHARINDEX(@FieldSeparator1, String + @FieldSeparator1) - 1) DataItem,
STUFF(String, 1, CHARINDEX(@FieldSeparator1, String + @FieldSeparator1), '') String
FROM #T
UNION ALL
SELECT
ID,
LEFT(String, CHARINDEX(@FieldSeparator1, String + @FieldSeparator1) - 1),
STUFF(String, 1, CHARINDEX(@FieldSeparator1, String + @FieldSeparator1), '')
FROM CTE
WHERE String > ''
)
SELECT
ID,
DataItem,
DataItem NewString
INTO #T1
FROM CTE WHERE CHARINDEX('''',DataItem)>0
ORDER BY ID
--SELECT * FROM #T1
UPDATE #T1 SET NewString=REPLACE(REPLACE(NewString,',','|'),'''','')
UPDATE #T1 SET DataItem='('+DataItem+')',NewString='('+NewString+')'
ALTER TABLE #T1 ADD Rn INT
UPDATE A SET A.Rn=Rn1 FROM
(
SELECT *,ROW_NUMBER()OVER(ORDER BY ID ASC)Rn1 FROM #T1
)A
DECLARE @Start INT =1,@End INT=(SELECT MAX(Rn) FROM #T1),@Str VARCHAR(1000),@Id INT
WHILE @Start<=@End
BEGIN
UPDATE T SET T.String=REPLACE(T.String,T1.DataItem,T1.NewString) FROM #Data T
INNER JOIN #T1 T1 ON T.ID=T1.Id AND T1.Rn=@Start
SET @Start=@Start+1
END
--SELECT * FROM #Data
DECLARE @FieldSeparator2 VARCHAR(10)=','
;WITH CTE AS
(
SELECT
ID,
LEFT(String, CHARINDEX(@FieldSeparator2, String + @FieldSeparator2) - 1) DataItem,
STUFF(String, 1, CHARINDEX(@FieldSeparator2, String + @FieldSeparator2), '') String
FROM #Data
UNION all
SELECT
ID,
LEFT(String, CHARINDEX(@FieldSeparator2, String + @FieldSeparator2) - 1),
STUFF(String, 1, CHARINDEX(@FieldSeparator2, String + @FieldSeparator2), '')
FROM CTE
WHERE String > ''
)
SELECT
ID,
REPLACE(REPLACE(DataItem,'|',','),'''','') AS String
FROM CTE
ORDER BY ID
只要有足夠的創造性努力,一切皆有可能,但 SQL 服務器確實不是進行復雜文本操作的地方:
declare @start varchar(max) = 'a,b,c(a,b,c),d,e,L(e,d,g)'
declare @inter1 varchar(max) = REPLACE(REPLACE(@start,'(','<b><a>'),')','</a></b>')
declare @inter2 varchar(max) = '<c><a>' + REPLACE(@inter1,',','</a><a>') + '</a></c>'
select REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(CONVERT(varchar(max),x.query('.')),'</a><a>',','),'<b><a>','('),'</a></b>',')'),'</a>',''),'<a>','')
from (select CONVERT(xml,@inter2)) t (abc)
cross apply abc.nodes('/c/a') u (x)
這通過將字符串變形為 XML,使用 XML 粉碎,它只對(轉換后的)非嵌套逗號進行操作,然后撤消 XML 化以恢復到原始狀態。
我已經將它作為幾個單獨的步驟完成,以便您可以根據需要查看 XML 化的中間階段。
使用下面的 function 獲取行列表。 我會幫你的
create FUNCTION [dbo].[spliting_function]
(
@p_string 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,@p_string,0) <> 0
BEGIN
SELECT
@sItem=RTRIM(LTRIM(SUBSTRING(@p_string,1,CHARINDEX(@sDelimiter ,@p_string,0)-1))),
@p_string=RTRIM(LTRIM(SUBSTRING(@p_string,CHARINDEX(@sDelimiter,@p_string,0)+LEN(@sDelimiter),LEN(@p_string))))
IF LEN(@sItem) > 0
INSERT INTO @List SELECT @sItem
END
IF LEN(@p_string) > 0
INSERT INTO @List SELECT @p_string -- Put the last item in
RETURN
END
select item from dbo.spliting_function('a,b,c',',')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.