Sql-Server-2014
如何使用 string_split - ms sql server 傳遞列名?
我正在嘗試使用字元串拆分來傳遞列名,因為我需要該表中的值才能與另一個表連接。
我已經在 Postgresql 中實現了這一點,我從這些列中獲取了值:
SELECT unnest(array["column_name1","column_name2","column_name3" AS "amount" FROM table1
unnest 與列名周圍的引號相結合,為每個值返回一個數組到一組行。
Amount 307579.00 25579.00 212871.00
現在我想在 MS Server 中做同樣的事情:
DECLARE @amount NVARCHAR(50) = 'column_name1/column_name2/column_name3' SELECT "value" from string_split(@amount,'/')
但這只會給我文字字元串:
Amount column_name1 column_name2 column_name3
我一直在嘗試和搜尋如何傳遞一個 elemant,它將讀取為列名並像第一個範例一樣在一個列中顯示值,也許我不應該使用字元串拆分器等。有點卡在這個..
您需要通過建構一個全新的 SELECT 查詢來使用動態 SQL 來實現您的邏輯。
例如:
DECLARE @CMD nvarchar(max), @amount NVARCHAR(50) = 'column_name1/column_name2/column_name3' SELECT @CMD = ISNULL(@CMD + ', ', N'SELECT ') + QUOTENAME([value]) FROM STRING_SPLIT(@amount,'/') SET @CMD = @CMD + N' FROM table1' PRINT @CMD EXEC(@CMD)
它的輸出將是:
SELECT [column_name1], [column_name2], [column_name3] FROM table1
為了獲取單個列下的所有值,您需要“取消透視”數據。有兩種主要方法可以做到這一點。一種是通過標準的 UNPIVOT 命令,如下所示:
DECLARE @CMD nvarchar(max), @amount NVARCHAR(50) = 'column_name1/column_name2/column_name3' SELECT @CMD = ISNULL(@CMD + ', ', N'SELECT unpvt.* FROM table1 UNPIVOT (amount FOR amounttype IN ( ') + QUOTENAME([value]) FROM STRING_SPLIT(@amount,'/') SET @CMD = @CMD + N' ) AS unpvt' PRINT @CMD EXEC(@CMD)
它的輸出將是:
SELECT unpvt.* FROM table1 UNPIVOT (amount FOR amounttype IN ( [column_name1], [column_name2], [column_name3]) AS unpvt
另一種方法是將 CROSS APPLY 與 Values 建構子一起使用,如下所示:
DECLARE @CMD nvarchar(max), @amount NVARCHAR(50) = 'column_name1/column_name2/column_name3' SELECT @CMD = ISNULL(@CMD + '), (', N'SELECT v.amount FROM table1 CROSS APPLY(VALUES(') + QUOTENAME([value]) FROM STRING_SPLIT(@amount,'/') SET @CMD = @CMD + N')) AS v(amount)' PRINT @CMD EXEC(@CMD)
它的輸出將是:
SELECT v.amount FROM table1 CROSS APPLY(VALUES([column_name1]), ([column_name2]), ([column_name3])) AS v(amount)