3

私は、Oracle 11g を使用して SQL 開発者と協力しています。これに沿ったものに見えるクエリがあります。

SELECT [column], [column], [column],...... rs.notes
FROM [table], [table], [table]............ return_sku rs
WHERE [conditions] AND [conditions] AND [conditions]

列にはタブ、スペース、および改行がありreturn_skuます (これはキャリッジ リターンだと思いますか?) クエリを実行すると、これらのスペース、キャリッジ リターン、およびタブをすべて非表示にする必要があります。

私は SQL にかなり慣れていませんが、最も人気のある検索結果は REPLACE 関数です。これをさまざまな方法で試した結果が得られなかったため、これを使用する方法がまったくわかりません。私は次のことを試しました;

SELECT [column], [column], [column],...... REPLACE(rs.notes, Char(10), '')
FROM [table], [table], [table]............ return_sku rs
WHERE [conditions] AND [conditions] AND [conditions]

これにより、次のエラー メッセージが表示されます。

ORA-00904: "RS"."NOTES": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 3 Column: 531

この機能を正しく使用するにはどうすればよいですか?

4

2 に答える 2

8

Oracle では、文字を削除するだけの場合は、replace 呼び出しの 3 番目の引数を省略できます。文字コードの関数は、char() ではなく chr() です。

だからあなたの行はSELECT ... replace(rs.notes,chr(10)) ...

于 2013-08-08T14:48:02.193 に答える
4

これは ORA-00904 に対処していません。これはタイプミスであると思われますが、実際のコードを見ないとわかりません。しかし、いくつかの文字を削除する必要がある場合は、ネストされた置換を行うことができます:

with return_sku as (
    select 'This is '||chr(9)|| ' a split'||chr(10)||chr(13)||'line' as notes
    from dual
)
select replace(replace(replace(replace(rs.notes, chr(10)), chr(13)), chr(9)), ' ')
from return_sku rs;

REPLACE(REPLACE(
----------------
Thisisasplitline

...しかし、regexp_replaceおそらくもう少しコストがかかる場合は、より管理しやすいかもしれません:

with return_sku as (
    select 'This is '||chr(9)|| ' a split'||chr(10)||chr(13)||'line' as notes
    from dual
)
select regexp_replace(rs.notes, '[ '||chr(10)||chr(13)||chr(9)||']')
from return_sku rs;

REGEXP_REPLACE(R
----------------
Thisisasplitline

改行 ( chr(10)) とキャリッジ リターン ( chr(13)) の両方を両方に含めました。やり過ぎかもしれません。ただし、空白を削除したい場合は、さらに簡単になります。

select regexp_replace(rs.notes, '\s') ...

または Posix バージョン:

select regexp_replace(rs.notes, '[[:space:]]') ...

@randcd が指摘したように、 or の 3 番目の引数replaceregexp_replacenull (または Oracle の null と同じ空の文字列) の場合、それを指定する必要はありません。

于 2013-08-08T15:07:33.963 に答える