ここで私が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に散在している場合。
- タグ自体の実際の内容。
私は完全な答えとしてこれを行うための時間を持っていますが、考えていない:あなたのテーブルに参加別のテーブルには1,2,3,4,5,6という数字のリストだけです(あなたは組合で作ることができます)。結合のON句を 'number'が<=長さ(case_title) - 長さ(replace(case_title、 '{'、 ''))である述語にします。これは本質的には回数{3回のフィールドを持つケースタイトルのために行が3回繰り返される回数です。サブストリング/ substring_indexを使用して、番号に応じて別々に大文字小文字を切り捨ててください.1行に3フィールド、2行に2フィールド、3行目に1フィールド... –
と正規表現マッチ方法を使用します。正規表現が値を見る前に、第2、第3などの行からフィールドを削除するために、1行目、2行目、3行目、2行目、3行目のsubstring_index(の出現)で文字列をカットします。 –
pps;最大フィールド数と同じ数の 'number'行が必要になるでしょう。あなたのケースタイトルの1つに450フィールドがあれば、450行の数字が必要になります。その行は450回繰り返しなければなりません。 etcetc –