このようなデータを含む列があります
1 Virginia - VA,Maryland -MD,null
2 California - CA,Nebraska - NE,Minnesota - MN
3 Wyoming - WY,null,null
などなど。文字列関数を使用して列を変更して、プレーンSQLからこのように表示する方法はありますか?
1 VA,MD
2 CA,NE,MN
3 WY
データに関して何もできないと仮定すると、次を使用してこれらの値を抽出できますREGEXP_REPLACE
。
SELECT id, REPLACE(REGEXP_REPLACE(column_name, '[^-]+ - ?([A-Z]{2},?)', '\1'),
',null', '')
FROM your_table
これが動作するデモです。
はい、できます。しかし、大きなものがありbut
ます。SQLはクエリ言語であり、文字列をフォーマットしたり、文字列を操作したりするためのものではありません。すべてのデータを1つの列に保存することは、テーブルの正規化にまだ取り組む必要があることを示す良い指標であるため、データベースを正規化することをお勧めします。この作業は、SQLを使用するデータベースではなく、アプリケーションで行う方が適切です。
はい、もちろん。
select substr(column_name, -2) from table_name
あなたがあなたのデータプロバイダーにあなたのためにそれをしてもらうことができればそれはより良いでしょうが。
データが示されているよりも汚れていて、Oracle 10g以降を使用している場合は、正規表現ルートをたどることができますが、ここでは必要ないようです。
select regexp_substr('California - CA', '[[:alpha:]]{2}$') from dual;
これがデモンストレーションする小さなSQLフィドルです。
必要に応じて列を変更しないでください。1つの列に複数の値を格納するのは悪いことです。テーブルを一度だけ修正します。
SELECT col1 AS ID, SUBSTR(SUBSTR(col2, 1, INSTR(col2, ',', 1, 1)-1), -2) AS STATE
FROM badTable
WHERE SUBSTR(SUBSTR(col2, 1, INSTR(col2, ',', 1, 1)-1), -4) <> 'null'
UNION ALL
SELECT col1 AS ID, SUBSTR(SUBSTR(col2, 1, INSTR(col2,',', 1, 2)-1), -2) AS STATE
FROM badTable
WHERE SUBSTR(SUBSTR(col2, 1, INSTR(col2,',', 1, 2)-1), -4) <> 'null'
UNION ALL
SELECT col1 AS ID, SUBSTR(col2, -2) AS STATE
FROM badTable
WHERE SUBSTR(col2, -4) <> 'null'