PostgreSQLのCASE WHENの返した値をINの右辺にしたい

PostgreSQLのINは、左辺の値が右辺に含まれていればTRUEを返します。

=# SELECT 1 IN (1, 2);
 ?column?
----------
 t
(1 row)

PostgreSQLのCASE WHENは条件に当てはまった要素を返します。

=# SELECT
    CASE
        WHEN TRUE THEN (1, 2)
        ELSE (3, 4)
    END
;
  row
-------
 (1,2)
(1 row)

ところが、この2つを組み合わせると ERROR: operator does not exist というエラーになります。

具体的にはこうです。

=# SELECT
    1 IN (
        CASE
            WHEN TRUE THEN (1, 2)
            ELSE (3, 4)
        END
    )
;
ERROR:  operator does not exist: integer = record
LINE 2:     1 IN (
              ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

PG_TYPEOF で型を確認すると、CASE WHENを使用しても、使用しなくても、 record 型であることが分かります。

=# SELECT
    PG_TYPEOF(CASE
        WHEN TRUE THEN (1, 2)
        ELSE (3, 4)
    END),
    PG_TYPEOF((1, 2))
;
 pg_typeof | pg_typeof
-----------+-----------
 record    | record
(1 row)

なぜCASE WHENを通すと、INの右辺にできなくなるのか分かりません。

コメント

2015 - 2017 (c) 成瀬基樹