我有一個像這樣的 SQL Server 表:
| ID | 描述 | 專案 |
|---|---|---|
| 123 | 女裝 | T 恤 & 底部 & 頂部 |
| 124 | 運動專案 | 羽毛球拍 |
| 125 | 小玩意 | iphone & airpod & 充電 |
我想將列items值拆分為每個專案的新行,如下所示:
| ID | 描述 | 專案 |
|---|---|---|
| 123 | 女裝 | T恤 |
| 123 | 女裝 | 底部 |
| 123 | 女裝 | 最佳 |
| 124 | 運動專案 | 羽毛球拍 |
| 125 | 小玩意 | iPhone |
| 125 | 小玩意 | 空中吊艙 |
| 125 | 小玩意 | 收費 |
uj5u.com熱心網友回復:
要創建功能,請檢查此螢屏截圖。選擇您的資料庫并執行以下操作:
如果您沒有 string_split 功能。(在 sqlserver2016 以下)您可以使用此功能,它在我們的生產環境中作業多年:
USE xxx
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[StringSplit]
(@pString VARCHAR(8000), @pDelimiter CHAR(1))
RETURNS TABLE WITH SCHEMABINDING AS
RETURN
WITH E1(N) AS (
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
),
E2(N) AS (SELECT 1 FROM E1 a, E1 b),
E4(N) AS (SELECT 1 FROM E2 a, E2 b),
cteTally(N) AS (
SELECT TOP (ISNULL(DATALENGTH(@pString),0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
),
cteStart(N1) AS (
SELECT 1 UNION ALL
SELECT t.N 1 FROM cteTally t WHERE SUBSTRING(@pString,t.N,1) = @pDelimiter
),
cteLen(N1,L1) AS(
SELECT s.N1,
ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1),0)-s.N1,8000)
FROM cteStart s
)
SELECT ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1),
Item = SUBSTRING(@pString, l.N1, l.L1)
FROM cteLen l
;
和查詢:
select * from
(SELECT 123 id, 'T-shirt & Bottom & Top' T UNION ALL
SELECT 124 , 'badminton racket'UNION ALL
SELECT 125 , 'iphone & airpod & charging' ) x
CROSS APPLY dbo.StringSplit(x.T, '&')
uj5u.com熱心網友回復:
WITH CTE(id ,description,items) AS
(
SELECT 123, 'Women clothing' , 'T-shirt & Bottom & Top' UNION ALL
SELECT 124 ,'sports items' ,'badminton racket'UNION ALL
SELECT 125 ,'gadgets' ,'iphone & airpod & charging'
)
SELECT C.ID, C.DESCRIPTION, TRIM(S.VALUE)
FROM CTE AS C
CROSS APPLY STRING_SPLIT(C.items, '&') S;
uj5u.com熱心網友回復:
您可以輕松使用以下 SQL 服務器代碼:
select Tbl.RowID,
Tbl.ColMain,
[value] ExtractedValue from
(
SELECT 123 as RowID, 'T-shirt & Bottom & Top' As ColMain UNION ALL
SELECT 124 , 'badminton racket' UNION ALL
SELECT 125 , 'iphone & airpod & charging'
) Tbl
CROSS APPLY String_Split(Tbl.ColMain, '&')

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/391570.html
標籤:sql sql-server 查询语句
上一篇:在同一個select陳述句中根據先前計算的行(或列)計算新的行(或列)
下一篇:如何在表中多次插入資料(SQL)
