2013-04-04 20 views
6

PostgreSQLでいくつかの列を選択する簡単なクエリを作成します。しかし、私はエラーが発生し続ける - 私はいくつかのオプションを試みたが、私のために働いていない。PostgreSQLで特定の列名を持つ列を選択してください。

select * from weather_data where column like '%2010%' 

任意のアイデア:私はfollowigを試し

org.postgresql.util.PSQLException: ERROR: syntax error at or near "column"

値の列を取得するには、次の瞬間に私は次のエラーを取得していますか?

+1

2010を含む列を返すか、特定の列の値に2010が含まれている行を返そうとしていますか?このような列のリストを選択することはできません(おそらく動的SQLを使用して)... – sgeddes

+0

columnという名前の列はありますか? –

+0

さて、私は名前の一部として2010年の列を返そうとしています。たとえば、名前がm01y2010の列があるので、m02y2010 ...などと同様に、その列に格納されている値も必要です。したがって、2010年の名前で列のリストを選択する方法はありません。 –

答えて

8

columnreserved wordあります。二重引用符を付けない限り、識別子として使用することはできません。のような:"column"

しかし、あなたはすべきではありません。予約語を識別子として使用しないでください。これまで

CREATE OR REPLACE FUNCTION f_build_select(_tbl regclass, _pattern text) 
    RETURNS text AS 
$func$ 
    SELECT format('SELECT %s FROM %s' 
       , string_agg(quote_ident(attname), ', ') 
       , $1) 
    FROM pg_attribute 
    WHERE attrelid = $1 
    AND attname LIKE ('%' || $2 || '%') 
    AND NOT attisdropped -- no dropped (dead) columns 
    AND attnum > 0;  -- no system columns 
$func$ LANGUAGE sql; 

コール:

SELECT f_build_select('weather_data', '2010'); 

へ...

select a list of columns with 2010 in their name:

..あなたは、システム・カタログ表のpg_attributeから動的SQLコマンドを構築するために、この機能を使用することができます

次のようなコードを返します。

SELECT foo2010, bar2010_id, FROM weather_data; 

実際にクエリを作成するまでは、戻り値の型がが不明なため、は完全に動的にすることはできません。

+1

Em、私は実際にはいませんでした - 私はちょうど2010年に列名を検索しようとしていました彼らの名前の一部として、値の1つの一部として2010年の列と呼ばれる列ではありません... –

+0

ありがとう!あなたのソリューションを使いました! –

0

そのような列はすべて検索することはできません。特定の列を指定する必要があります。

例えば、

select * from weather_data where weather_date like '%2010%' 

以上が日付である場合、まだ、日付範囲を指定:

select * from weather_data where weather_date between '2010-01-01' and '2010-12-31' 
5

これは、(必要な場合は、必要に応じてスキーマを追加することができます)あなたの特定のテーブルの列のリストを取得します:

あなたは、動的SQL文を作成するには、そのクエリを使用することができます
SELECT column_name 
FROM information_schema.columns 
WHERE table_name = 'yourtable' 
    and column_name like '%2010%' 

SQL Fiddle Demo

結果を返す

1

このような動的構造を使用しようとすると、通常、動的アクセスに適したhstore、、xmlなどのデータ形式を使用する必要があることが示されます。

You アプリケーションでSQLをオンザフライで作成して動的列リストを取得します。 INFORMATION_SCHEMAを照会して、表の列に関する情報を取得し、照会を作成することができます。

これは、PL/pgSQLでこれを行うとEXECUTEで生成されたクエリを実行することが可能ですが、あなたは、あなたが展開することはできません、あなたが取得し、コンポジット・タプルをデコードしなければならないとして、それがやや困難、結果RECORDで動作するように見つけることができます結果は通常の列リストに設定されます。観察:

craig=> CREATE OR REPLACE FUNCTION retrecset() returns setof record as $$ 
values (1,2,3,4), (10,11,12,13); 
$$ language sql; 

craig=> select retrecset(); 
    retrecset 
--------------- 
(1,2,3,4) 
(10,11,12,13) 
(2 rows) 

craig=> select * from retrecset(); 
ERROR: a column definition list is required for functions returning "record" 

craig=> select (r).* FROM (select retrecset()) AS x(r); 
ERROR: record type has not been registered 

あなたができることは、生のレコードを取得し、それをクライアントで復号することです。 SQLから索引付けすることはできません。他のものに変換することはできません。ほとんどのクライアントAPIは、匿名レコードのテキスト表現を解析する機能を提供していないので、あなた自身で書く必要があります。

したがって、の結果の型を知らずにPL/PgSQLから動的レコードを返しますが、それは特に有用ではなく、クライアント側で処理するのは苦痛です。最初は、クライアントを使用してクエリを生成するだけです。

SELECT 'SELECT ' || array_to_string(ARRAY(SELECT 'o' || '.' || c.column_name 
     FROM information_schema.columns As c 
      WHERE table_name = 'officepark' 
      AND c.column_name NOT IN('officeparkid', 'contractor') 
    ), ',') || ' FROM officepark As o' As sqlstmt 

結果はあなただけさらに実行する必要がSQL SELECTクエリです:

+0

「やや難しい」とは、戻り値の型が不明なため「不可能」の意味です。列定義リストを提供する必要がありますが、列定義リストを知っていれば、動的クエリーを最初に実行する必要はありません。 Catch 22. –

+0

@ErwinBrandstetter結果セットの拡張されていない匿名レコードがあれば、列定義リストなしで 'record'または' setof record'を返す関数を呼び出すことができます。更新された回答をご覧ください。 –

+0

+1素敵なアップデート。問題を明確にする。 –

0

このhereを見つけました。私にフォーマットされた出力を返しますが、それが唯一のシェルで動作

psql -U myUser -d myDB -t -c "SELECT...As sqlstm" | psql -U myUser -d myDB 

: それは、このようなシェルにIパイプので、結果を自分のニーズに適合します。 これはいつか誰かを助けることを願っています。