0

テーブル内のデータが次の場合:

select * from data;

 key  | value                    
------+---------
 a    | a_value
 b    | b_value
 c    | c_value
 d    | d_value
 e    | e_value
 f    | f_value

1 つのクライアントが Web サーバーに接続して a の値を要求すると、アプリケーションは次のことを試みます。

select value where key = 'c';

結果値をクライアントに送信します

3 つのクライアントが Web サーバーに接続する場合、3 つのステートメントが発生します。

  select value where key = 'e';  # client 1

  select value where key = 'c';  # client 2

  select value where key = 'a';  # client 3

リソース上の理由から、多くのステートメントを 1 つの select ステートメントに統合したいと考えています。

select * where key = 'e' or key = 'c' or key = 'a';

 key  | value                    
------+---------
 a    | a_value
 c    | c_value
 e    | e_value

しかし問題は、結果のシーケンスが私の WHERE 句と同じではないことです。そのため、結果とクライアントのクエリを区別できません。クライアントに価値を送り返したい場合

'e_value' to client 1
'c_value' to client 2
'a_value' to client 3

ありがとう!!

4

1 に答える 1

0

ユースケースはよくわかりませんが、次のようなクエリを使用すると、

  1. .. 定義済みの順序で結果を取得する
  2. .. 結果セットの行を識別する

SELECT v.*, d.value
FROM   data
JOIN  (
   VALUES
     (1::int, 'e'::text)  -- explicit cast may not be necessary
    ,(2, 'c')
    ,(3, 'a')
    ) v(client, key) USING (key)
ORDER  BY v.client;

戻り値:

client | key | value
-------+-----+------
1      | e   | e_value
2      | c   | c_value
3      | a   | a_value
于 2012-09-12T16:04:12.483 に答える