String_Split 使用 SQL 以逗号分隔列

Posted

技术标签:

【中文标题】String_Split 使用 SQL 以逗号分隔列【英文标题】:String_Split using SQL to separate column by commas 【发布时间】:2020-12-18 14:27:34 【问题描述】:

我正在尝试使用“,”分割一串文本。有问题的文本是我们的utm 参数,看起来像这样:

\""medium\"":\""cpc\"",\""source\"":\""google\"",\""term\"":\""virtual cocktail making classes\"",\""campaign\"":\""virtual-events\""

我的想法是最终得到四列:Medium、Source、Term 和 Campaign。这是我到目前为止尝试过的,但在 APPLY 附近不断出现语法错误。


(SELECT  id, VALUE
, ROW_NUMBER() OVER(PARTITION by id ORDER BY id) AS "RowNum"
FROM seodata
CROSS APPLY
string_split(utmparams,',')
)

SELECT id,
[1] AS "medium", [2] AS "source", [3] AS "term", [4] AS "campaign"
FROM NAME_CTE
PIVOT 
(max(VALUE) FOR RowNum IN ([1],[2],[3],[4])) AS PVT

【问题讨论】:

【参考方案1】:

看起来你有 JSON 数据。如果是这样,我会推荐 JSON 函数而不是字符串函数:

select s.id, j.*
from seodata s
cross apply openjson(s.utmparams) with(
    medium   nvarchar(50),
    source   nvarchar(50),
    term     nvarchar(50),
    campaign nvarchar(50)
) j

【讨论】:

【参考方案2】:

正如其他人所提到的,如果这实际上是您正在做的事情,那么可能有更好的方法来处理 json。话虽如此,这是我的解决方案,仅使用交叉应用、一些替换功能和枢轴。

DROP TABLE IF EXISTS #Table
CREATE TABLE #Table
(
SampleData VARCHAR(MAX)
)
INSERT INTO #Table VALUES
('\""medium\"":\""cpc\"",\""source\"":\""google\"",\""term\"":\""virtual cocktail making classes\"",\""campaign\"":\""virtual-events\""')

SELECT
*
FROM
(
SELECT
SampleData
,REPLACE(LEFT(value,CHARINDEX(':',value)-1),'','') Col
,REPLACE(RIGHT(value,LEN(value) - CHARINDEX(':',value)),'','') Value
FROM #Table
CROSS APPLY STRING_SPLIT(REPLACE(REPLACE(SampleData,'""',''),'\',''),',')
) z
PIVOT
(
MAX(Value)
FOR Col IN (medium, source, term, campaign)
) p

【讨论】:

以上是关于String_Split 使用 SQL 以逗号分隔列的主要内容,如果未能解决你的问题,请参考以下文章

MS SQL Server的STRING_SPLIT和STRING_AGG函数

可以在 VIEW 中使用 String_Split 吗?

使用 oracle sql 以逗号分隔的字符串

如何转换逗号分隔的 varchar 以用于 pl/sql 中的“IN”子句?

如何在 SQL Server 2005 中将多行组合成以逗号分隔的列表?

插入逗号以分隔 spark sql 查询结果的错误