MySQL - 获取前3个逗号分隔值

时间:2013-03-27 08:16:44

标签: mysql string

我有一个查询,它返回一个带有一组逗号分隔值的字段。我想将这三个值中的前三个放入查询结果中的单独列中。

我可以使用SUBSTRING_INDEX获得第一个,但我怎样才能获得其他两个?

SELECT 
  'aaaaa, bbbbb, ccccc',
  SUBSTRING_INDEX('aaaaa, bbbbb, ccccc', ',', 1) AS column_one
编辑 - 糟糕,抱歉忘了提及。我要分割的值可能比要提取的三个字符串多(或少)。

例如,上面的字符串可以很容易地是'aaaaa'或'aaaaa,bbbbb,ccccc,ddddd,eeeee'。

在每种情况下,我只需要前三个(或者存在多个)。

任何建议表示赞赏。

感谢。

1 个答案:

答案 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