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函数
如何转换逗号分隔的 varchar 以用于 pl/sql 中的“IN”子句?