3

ofSELECTを返すクエリを作成しようとしています。RECORDROWS

RECORD を取得して単一の ROW を返すことができるため、問題の半分を解決しました。しかし、ROWS のセットを返す場合はどうでしょうか?

たとえば、次のクエリを見てください。

SELECT * FROM
  RECORD(
    (
      ROW(1::integer, 'Florida'::character varying)
    )
  ) AS tbl (id integer, state character varying)

私は私が予想するものを手に入れます:

+==============+
| id | state   |
+====+=========+
| 1  | Florida |
+----+---------+

ただし、RECORD に行を 1 つ追加しようとすると、ここで問題が発生します。

SELECT * FROM
  RECORD(
    (
      ROW(1::integer, 'Florida'::character varying),
      ROW(2::integer, 'Georgia'::character varying)
    )
  ) AS tbl (id integer, state character varying)

次のような結果が予想されます。

+==============+
| id | state   |
+====+=========+
| 1  | Florida |
+----+---------+
| 2  | Georgia |
+----+---------+

ただし、代わりに次の PostgreSQL エラーが表示されます。

********** Error **********
ERROR: function return row and query-specified return row do not match
SQL state: 42804
Detail: Returned type record at ordinal position 1, but query expects integer.

ここで何が欠けているのですか?何か些細なことですか、それとも私はこれに完全に間違っていますか? ポインタや提案は大歓迎です。ありがとうございます!

関連するメモ: これがストアド プロシージャで行われる場合、 を返すことができることは理解していますがSETOF、このユース ケースでは、ストアド プロシージャを使用せずに、クエリを介して直接 ROWS の RECORD を返すことに関心があります。

4

1 に答える 1

5

rowコンストラクターを使用してこれを行う方法はわかりませんが、values句を使用すると、私にとってははるかに簡単 (かつクリーン) に思えます。

select * 
from (
  values 
    (1, 'Florida'),
    (2, 'Georgia')
) AS tbl (id, state);

またはCTEを使用して

with tbl (id, state) as (
  values 
     (1, 'Florida'),
     (2, 'Georgia')
) 
select * 
from tbl;

私が間違っていなければ、キーワードを使用すると、両方の行が単一のRECORDレコードに変わります。1 つのレコードに複数の行を保持することはできません。

編集(クレイグのコメントの後):

全体像を完成させるために、列名を指定する可能性はありませんが、以下はまったく同じ結果を返します。

values 
  (1, 'Florida'),
  (2, 'Georgia');

これは、どこでも使用SELECTできます。

于 2013-05-31T21:01:12.390 に答える