Postgresqlでアンダースコアを検索する場合、文字_
のリテラル使用は機能しません。たとえば、すべてのテーブルで_by
で終わる列を検索して、変更ログやアクティビティ情報などを検索したい場合、 updated_by
、reviewed_by
など、次のクエリはほとんど機能します。
SELECT table_name, column_name FROM information_schema.columns
WHERE column_name LIKE '%_by'
基本的にはアンダースコアを完全に無視し、LIKE '%by'
を検索したかのように戻ります。これはすべてのケースで問題になるわけではありませんが、問題になる可能性があります。下線を検索する方法は?
アンダースコアをエスケープするには、バックスラッシュを使用する必要があります。サンプルクエリを次のように変更します。
SELECT table_name, column_name FROM information_schema.columns
WHERE column_name LIKE '%\_by'
同じ問題が発生し、単一のバックスラッシュも機能しませんでした。私はPostgreSQLコミュニティでこのドキュメントを見つけました。
正しい方法は、バックスラッシュでアンダースコアをエスケープすることです。実際には、クエリに2つのバックスラッシュを記述する必要があります。
*からfooを選択します '%\\ _ baz'のようなバー
最初のバックスラッシュはクエリパーサーの2番目のバックスラッシュを引用符で囲んでいるため、システム内で終わるのは%\ _ bazであり、LIKE関数はそれをどうするかを認識しています。
したがって、次のようなものを使用します。
SELECT table_name, column_name FROM information_schema.columns
WHERE column_name LIKE '%\\_by'
ソースドキュメント: https://www.postgresql.org/message-id/10965.962991238%40sss.pgh.pa.us