1

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

我可以得到第一个,SUBSTRING_INDEX但我怎样才能得到另外两个?

SELECT 
  'aaaaa, bbbbb, ccccc',
  SUBSTRING_INDEX('aaaaa, bbbbb, ccccc', ',', 1) AS column_one

编辑 - 哎呀,抱歉忘了提。我要拆分的值可能多于(或少于)三个要提取的字符串。

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

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

任何建议表示赞赏。

谢谢。

4

1 回答 1

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结果。

在此处查看小提琴。

编辑

如果您想考虑可能具有少于三个值的字符串,您可以使用如下内容:

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

在此处查看小提琴。

于 2013-03-27T08:19:38.160 回答