我有一个查询,它返回一个带有一组逗号分隔值的字段。我想将这三个值中的前三个放入查询结果中的单独列中。
我可以使用SUBSTRING_INDEX
获得第一个,但我怎样才能获得其他两个?
SELECT
'aaaaa, bbbbb, ccccc',
SUBSTRING_INDEX('aaaaa, bbbbb, ccccc', ',', 1) AS column_one
编辑 - 糟糕,抱歉忘了提及。我要分割的值可能比要提取的三个字符串多(或少)。
例如,上面的字符串可以很容易地是'aaaaa'或'aaaaa,bbbbb,ccccc,ddddd,eeeee'。
在每种情况下,我只需要前三个(或者存在多个)。
任何建议表示赞赏。
感谢。
答案 0 :(得分:2)
您可以使用SUBSTRING_INDEX两次,第二次使用-1参数:
SELECT
'aaaaa, bbbbb, ccccc',
SUBSTRING_INDEX('aaaaa, bbbbb, ccccc', ',', 1) AS column_one,
SUBSTRING_INDEX(SUBSTRING_INDEX('aaaaa, bbbbb, ccccc', ',', 2), ',', -1) AS column_two,
SUBSTRING_INDEX(SUBSTRING_INDEX('aaaaa, bbbbb, ccccc', ',', 3), ',', -1) AS column_three
如果参数为负数,则返回最终分隔符右侧的所有内容(从右侧开始计算)。例如
SUBSTRING_INDEX('aaaaa, bbbbb, ccccc', ',', 2)
将返回aaaaa, bbbbb
SUBSTRING_INDEX(
aaaaa,bbbbb , ',', -1)
将返回bbbbb
您也可能希望使用','作为分隔符,或TRIM结果。
请参阅小提琴here。
修改强>
如果要考虑可能少于三个值的字符串,可以使用以下内容:
SELECT
s,
SUBSTRING_INDEX(s, ',', 1) AS column_one,
CASE WHEN LENGTH(s)-LENGTH(Replace(s, ',', ''))>0
THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, ',', 2), ',', -1)
ELSE NULL END AS column_two,
CASE WHEN LENGTH(s)-LENGTH(Replace(s, ',', ''))>1
THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, ',', 3), ',', -1)
ELSE NULL END AS column_three
FROM
strings
请参阅小提琴here。