1

このようなデータを含む列があります

     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
4

4 に答える 4

3

データに関して何もできないと仮定すると、次を使用してこれらの値を抽出できますREGEXP_REPLACE

SELECT id, REPLACE(REGEXP_REPLACE(column_name, '[^-]+ - ?([A-Z]{2},?)', '\1'), 
           ',null', '')
FROM your_table

これが動作するデモです。

于 2012-09-13T19:05:40.877 に答える
2

はい、できます。しかし、大きなものがありbutます。SQLはクエリ言語であり、文字列をフォーマットしたり、文字列を操作したりするためのものではありません。すべてのデータを1つの列に保存することは、テーブルの正規化にまだ取り組む必要があることを示す良い指標であるため、データベースを正規化することをお勧めします。この作業は、SQLを使用するデータベースではなく、アプリケーションで行う方が適切です。

于 2012-09-13T18:59:24.720 に答える
2

はい、もちろん。

select substr(column_name, -2) from table_name

あなたがあなたのデータプロバイダーにあなたのためにそれをしてもらうことができればそれはより良いでしょうが。

データが示されているよりも汚れていて、Oracle 10g以降を使用している場合は、正規表現ルートをたどることができますが、ここでは必要ないようです。

select regexp_substr('California - CA', '[[:alpha:]]{2}$') from dual;

これがデモンストレーションする小さなSQLフィドルです。

于 2012-09-13T19:04:38.460 に答える
1

必要に応じて列を変更しないでください。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'

これが機能するSQLフィドル

于 2012-09-13T19:10:49.920 に答える