我正在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 |
+------------+