从SQL Server获取CSV字段中的第一个值



我正在SQL Server 2018中开发一个数据库。不幸的是,有一个多选列将值存储为列中的CSV字符串。

可以看到以下值:

Value1
Value1,Value2
Value1,Value2,Value3
....

我尝试了以下方法

select SUBSTRING(t.FIELD, 0,charindex(',',t.FIELD)) as first_value 
from TABLE t

但是,只有当存在逗号时,才返回第一个值,而只有一个值时,则不会返回

当前查询返回

NULL
Value1
Value1

我希望查询返回

Value1
Value1
Value1

如有任何帮助,将不胜感激

您可以通过在调用charindex():的字段中添加逗号来轻松修复逻辑

select left(t.FIELD, charindex(',', t.FIELD + ',') - 1) as first_value 

注意,我还用left()替换了substr(),因为这更简洁。

您还可以利用JSON_VALUE从逗号分隔的值列表中获取第一个值,如下所示:

DECLARE @t table(cval VARCHAR(100))
INSERT INTO @t values
('Value1'),
('Value1,Value2'),
('Value1,Value2,Value3');
--Convert the comma separated list into JSON Array and pick the first value
SELECT JSON_VALUE(
CONCAT('["',replace(cval,',','","'),'"]'),'$[0]') as firstValue
FROM @T

还有一种使用xml的方法。

SELECT  
CAST(concat('<root><v>',replace(cval,',','</v><v>'),'</v></root>') AS xml).value('(/root/v)[1]', 'nvarchar(50)')
FROM @T
+------------+
| firstValue |
+------------+
| Value1     |
| Value1     |
| Value1     |
+------------+

相关内容

最新更新