web-dev-qa-db-ja.com

Postgresqlでアンダースコアをエスケープする方法

Postgresqlでアンダースコアを検索する場合、文字_のリテラル使用は機能しません。たとえば、すべてのテーブルで_byで終わる列を検索して、変更ログやアクティビティ情報などを検索したい場合、 updated_byreviewed_byなど、次のクエリはほとんど機能します。

SELECT table_name, column_name FROM information_schema.columns
WHERE column_name LIKE '%_by'

基本的にはアンダースコアを完全に無視し、LIKE '%by'を検索したかのように戻ります。これはすべてのケースで問題になるわけではありませんが、問題になる可能性があります。下線を検索する方法は?

21
Joe M

アンダースコアをエスケープするには、バックスラッシュを使用する必要があります。サンプルクエリを次のように変更します。

SELECT table_name, column_name FROM information_schema.columns
WHERE column_name LIKE '%\_by'
20
Joe M

同じ問題が発生し、単一のバックスラッシュも機能しませんでした。私は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

3
Taylor D