2

指定された列を含むテーブル名のリストを取得し、アンダースコアを含むテーブル名を除外するスクリプトを作成しています。私が試してみました:

SELECT TABLE_NAME
FROM USER_TAB_COLUMNS
WHERE 
    COLUMN_NAME = 'SERIAL_NUMBER' AND
    TABLE_NAME NOT LIKE '%\_%';

このクエリは、アンダースコアを含むテーブル名を引き続き取得します。私は何が欠けていますか?

4

1 に答える 1

10

アンダースコアは、LIKE ステートメントのワイルドカードです。正確に 1 文字に一致します。代わりにこれを試してください:

SELECT TABLE_NAME
FROM USER_TAB_COLUMNS
WHERE COLUMN_NAME = 'SERIAL_NUMBER' 
AND instr(TABLE_NAME, '_') = 0;

投稿した後、あなたが実際にアンダースコアをエスケープしようとしていることに気付きました。LIKE にはデフォルトのエスケープ文字がないため、何をしているのかをデータベースに伝える必要があります。

  SELECT TABLE_NAME
FROM USER_TAB_COLUMNS
WHERE COLUMN_NAME = 'SERIAL_NUMBER' 
AND TABLE_NAME  NOT LIKE '%\_%' ESCAPE '\';

詳細をご覧ください。

于 2013-04-11T15:56:56.440 に答える