1

postgres で次の 2 つのテーブルを結合したい:

table1 (
   i1 character varying
 , i2 character varying
 , i3 character varying
)  

table2 (
   i4 character varying
 , startorend character varying
 , begin integer
 , end character integer
)

table1 には次の値が含まれます。

  p1  p2    p3
  p4  p10   p6
  p7  p8    p9
  p99 p199  p299

table2 には次の値が含まれます。

  p4  begin 1   12
  p4  end   13  14
  p7  begin 19  20
  p1  end   21  22

次に、以下のルールに従うように、2 つのテーブルを結合します。

1. table1.i1=table2.i4 の場合
   1a. table2 に対応する begin と end を含む行が 2 つある場合、
       次に、table2.begin と table2.end を選択します
       table2.i4 の begin 列と end 列からそれぞれ。  
   1b. table2 に対応する begin または end を含む行が 1 つしかない場合、
       次に、デフォルト値を end(9999) および begin(0) と想定して書き込みます。

上記のルールを適用すると、以下の表が得られます。

p4      1            14
p1      0(default)   22 (as it just contains end column in table 2, therefore 0(begin) as default is inserted)
p7      19           9999(default) (as it just contains begin column in table2, therefore 9999(end) as default is inserted)

テーブルを効率的に結合できますが、万が一デフォルト値を挿入することはできますか?

4

2 に答える 2

1
SELECT i4
      ,CASE WHEN count(*) > 1 OR min(startorend) = 'begin' THEN min("begin")
            ELSE 0 END AS the_begin
      ,CASE WHEN count(*) > 1 OR min(startorend) = 'end'   THEN min("end")
            ELSE 9999 END AS the_end
FROM   table2 t2
WHERE  EXISTS (SELECT 1 FROM table1 t1 WHERE t1.i1 = t2.i4)
GROUP  BY i4

1 つ以上の一致する行が存在するか、またはそれだけが重要であるtable1.i1仮定します。UNIQUE

beginおよびend、SQL 標準の予約語です。それらを識別子として使用しないでください。そのため、二重引用符を付けました。

于 2013-10-09T03:48:05.363 に答える