2017-12-09 3 views
0

私はそのような列名を持つテーブルを持っている場合:Postgresqlで特定の部分文字列を含まないすべての列を選択するには?

name, 
name_raw, 
item, 
item_raw, 
message, 
message_raw 
... 
... etc. 

がどのように動的に_rawで終わっていないすべての列を選択することができますか?

SELECT 
    [SOME REGEX LOGIC HERE] 
FROM 
    mytable 

または類似の可能性:

はこのようなものですか?

+1

を「エスケープ」する必要があるクエリのワイルドカードであるため? –

+0

多くの列があります。私はそれが正規表現を介してフィルタリングするのは簡単で希少であると思っていましたが、私はPostgres/sqlの新機能ですので、これが意味をなさないか教えてください。 – Rotareti

+1

意味がありません。 SQL!= OOP。可能であれば、クエリは静的でなければなりません。 –

答えて

1

(静的)クエリを作成できない列が多数ある場合は、おそらくデータベースのスキーマを変更する必要があります。

スキーマを変更できない場合は、postgresqlのJSON機能を使用する、すばやく解決策があります。複数の列を持つ伝統的なテーブルを返すのではなく、名前が_rawで終わる元のテーブルのすべての列を含むjsonオブジェクトを含む単一の列を返します。

SELECT (
    SELECT json_object_agg(key,value) 
    FROM json_each(to_json(t)) 
    WHERE key ~ 'raw$' 
) FROM mytable; 

アイデアは、JSONオブジェクトにmytableからすべての行を変換し、オブジェクトのメンバーをフィルタリングするJSON関数を使用することです。

1

たとえば、情報スキーマを使用します。

SELECT column_name 
FROM information_schema.columns 
WHERE table_schema = 'my_schema' 
AND table_name = 'mytable' 
AND NOT column_name LIKE '%\_raw' 

ノートアンダースコア自体は、それはあなたが動的にそれをしたいと思うなぜ地球上

関連する問題