2017-11-15 17 views
1

ここで私がMySQL(MariaDB)としたいことがあります。私は、 'Case_Title'列の中括弧(中身をタグと呼ぶ)の間の内容の部分文字列を取得します。私のテーブルはこのように見えます。(複数の)括弧から1つの文字列で値を抽出する

表:スタックオーバーフローを検索することにより例

| Case_ID | Case_Title      | Department | 
|---------|----------------------------------|-------------| 
| 7032389 | {RJ1} Not able to connect  | Consumer | 
| 7243040 | {RJ2}{ZO}{WAD} Connection issues | Business | 
| 7249910 | {O2A} No incoming mgs {WAD}  | Consumer | 
|---------|----------------------------------|-------------| 

は、私はこれらの部分文字列を取得するために、二つのオプションを思い付きました。

1 - 正規表現を使用する。私はMariaDBにいるので、REGEXP_SUBSTR、REGEXP_INSTR、REGEXP_REPLACEを使用できます。

SELECT Case_ID, REGEXP_SUBSTR(Case_title,'{(.*?)}') as 'Tag' 
FROM cases 

2からSUBSTR()INSTR()の組み合わせ。

SELECT Case_ID, SUBSTR(Case_Title,INSTR(Case_Title,"{"), INSTR(Case_Title,"}") - INSTR(Case_Title,"{") + 1) as 'Tag' 
FROM cases 

両方のオプションが出力されます:

| Case_ID | Tag | 
|---------|-------| 
| 7032389 | {RJ1} | 
| 7243040 | {RJ2} | 
| 7249910 | {O2A} | 
|---------|-------| 

しかし、Case_Titleで他の 'タグは' は無視されます。私はちょうどこのような出力を得るための方法を見つけるように見えることはできません:{RJ1},{ZO},{WAD}

| Case_ID | Tag | 
|---------|-------| 
| 7032389 | {RJ1} | 
| 7243040 | {RJ2} | 
| 7243040 | {ZO} | 
| 7243040 | {WAD} | 
| 7249910 | {O2A} | 
| 7249910 | {WAD} | 
|---------|-------| 

が、私はむしろのようにそれらを連結するよりも、各タグのために新しいレコード/行を持っているしたいと思いますのでご注意ください。また、私は事前に知らない:

  • タイトルに含まれるタグの数。
  • タグはCase_Titleにあります。
  • すべてのタグがグループ化されている場合、またはCase_Titleに散在している場合。
  • タグ自体の実際の内容。
+0

私は完全な答えとしてこれを行うための時間を持っていますが、考えていない:あなたのテーブルに参加別のテーブルには1,2,3,4,5,6という数字のリストだけです(あなたは組合で​​作ることができます)。結合のON句を 'number'が<=長さ(case_title) - 長さ(replace(case_title、 '{'、 ''))である述語にします。これは本質的には回数{3回のフィールドを持つケースタイトルのために行が3回繰り返される回数です。サブストリング/ substring_indexを使用して、番号に応じて別々に大文字小文字を切り捨ててください.1行に3フィールド、2行に2フィールド、3行目に1フィールド... –

+0

と正規表現マッチ方法を使用します。正規表現が値を見る前に、第2、第3などの行からフィールドを削除するために、1行目、2行目、3行目、2行目、3行目のsubstring_index(の出現)で文字列をカットします。 –

+0

pps;最大フィールド数と同じ数の 'number'行が必要になるでしょう。あなたのケースタイトルの1つに450フィールドがあれば、450行の数字が必要になります。その行は450回繰り返しなければなりません。 etcetc –

答えて

0

これは、最初にデータをピボットし、それらをそれぞれ}{で区切ることによって機能します。これは、それ自身の行で各値を取得します。そこから最初の}の後にすべての値が削除されました。ピボット時に取り外された紛失したブラケットを復元するには、いくつかの連結が必要でした。

SELECT Case_ID, 
CONCAT(substring_index(CASE WHEN RIGHT(CASE WHEN LEFT(tag,1) = '{' 
              THEN tag 
              ELSE CONCAT('{',tag) END,1) = '}' 
          THEN CASE WHEN LEFT(tag,1) = '{' 
             THEN tag 
             ELSE CONCAT('{',tag) 
           END 
          ELSE CONCAT(CASE WHEN LEFT(tag,1) = '{' 
              THEN tag 
              ELSE CONCAT('{',tag) 
             END,'}') 
         END,'}',1),'}') AS tag 
FROM (
SELECT DISTINCT Case_ID, SUBSTRING_INDEX(SUBSTRING_INDEX(Case_Title, '}{', n), '}{', -1) tag 
FROM (SELECT 1 n 
     UNION ALL 
     SELECT 2 
     UNION ALL 
     SELECT 3 
     UNION ALL 
     SELECT 4 
     UNION ALL 
     SELECT 5) n 
INNER JOIN cases ON CHAR_LENGTH(Case_Title)-CHAR_LENGTH(REPLACE(Case_Title, '}{', ''))>=n-1) a 

入力

Case_ID Case_Title      Department 
7032389 {RJ1} Not able to connect  Consumer 
7243040 {RJ2}{ZO}{WAD} Connection issues Business 
7249910 {O2A} No incoming mgs {WAD}  Consumer 

出力

Case_ID tag 
7032389 {RJ1} 
7243040 {RJ2} 
7249910 {O2A} 
7243040 {ZO} 
7243040 {WAD} 

SQLフィドル:http://sqlfiddle.com/#!9/0fa9c13/94/0

+0

Case_ID 7249910を除いて、魅力的です。ケースタイトルの最後に{O2A}を出力し、{WAD}を無視します。 –

+0

その理由は、 ''} {''で文字列を分割するだけだからです。したがって、最初に文字列を 'REGEXP_REPLACE(Case_Title、 ')(。*?){'、 '} {'}' –

関連する問題