1

PostgreSQL で XOR 関数をシミュレートするにはどうすればよいですか? または、少なくとも、これは XOR のような状況だと思います。

データが次のようになっているとします。

id | col1 | col2 | col3
---+------+------+------
1  | 1    |      | 4
2  |      | 5    | 4
3  |      | 8    | 
4  | 12   | 5    | 4
5  |      |      | 4
6  | 1    |      | 
7  |      | 12   | 

そして、列の1つだけが埋められている行に対して1列を返したいと思います.(col3今のところ無視してください..

この 2 列の例から始めましょう。

SELECT
    id, COALESCE(col1, col2) AS col
FROM
    my_table
WHERE 
    COALESCE(col1, col2) IS NOT NULL -- at least 1 is filled in
AND
    (col1 IS NULL OR col2 IS NULL) -- at least 1 is empty
;

これはうまく機能し、次のようになります。

id | col
---+----
1  | 1  
3  | 8   
6  | 1  
7  | 12

しかし今、私はcol3同様の方法で含めたいと思います。このような:

id | col
---+----
1  | 1  
3  | 8 
5  | 4  
6  | 1  
7  | 12

より一般的な方法でこれを行うにはどうすればよいですか?Postgres はそのような方法をサポートしていますか?

私はそのようなものを見つけることができません。

4

3 に答える 3

5

ちょうど 1 列が入力された行:

select * from my_table where
   (col1 is not null)::integer 
   +(col1 is not null)::integer 
   +(col1 is not null)::integer 
   =1

1 つまたは 2 つの行

select * from my_table where
   (col1 is not null)::integer 
   +(col1 is not null)::integer 
   +(col1 is not null)::integer 
   between 1 and 2
于 2015-01-05T23:37:19.307 に答える