1

カンマ区切りの値のセットを含むフィールドを返すクエリがあります。これらの値の最初の3つを、クエリ結果の別々の列に入れたいと思います。

を使用して最初のものを取得SUBSTRING_INDEXできますが、他の2つを取得するにはどうすればよいですか?

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

編集-おっと、申し訳ありませんが言及するのを忘れました。分割したい値は、抽出する文字列が3つより多い(または少ない)可能性があります。

たとえば、上記の文字列は簡単に「aaaaa」または「aaaaa、bbbbb、ccccc、ddddd、eeeee」になります。

いずれの場合も、最初の3つだけが必要です(または、いくつでも存在します)。

アドバイスをいただければ幸いです。

ありがとう。

4

1 に答える 1

2

SUBSTRING_INDEXを2回使用でき、2番目は-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することもできます。

こちらのフィドルをご覧ください。

編集

値が3つ未満の文字列を検討する場合は、次のように使用できます。

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 に答える