0

設定:

私はPostgreSQL9.1.2を使用しており、以下のような基本的なテーブルがあり、YまたはNの値をとることができる4つのバイナリ列があります。これらの列には、以下の表で「-」と示したNull値も含まれています。 :

    Binary Col 1   Binary Col 2   Binary Col 3   Binary Col 4   Summary Col
    ------------   ------------   ------------   ------------   -----------
1.       Y             N               -             N               1
2.       -             Y               N             Y               2
3.       N             N               -             N               0
4.       -             -               -             -               -
5.       Y             Y               Y             Y               4         

問題:

これらの4つのバイナリ列で発生する「Y」の数に基づいて入力される要約列をテーブルに含めたいと思います。目的の出力を示すために、上の表に5つのエントリ例を示しました。注意すべき重要な点の1つは、エントリ3('Yが観測されない)のようなケースとエントリ4(すべてのバイナリ列がnull)のようなケースを区別できるようにしたいということです。これは1回限りの作業であり、この重複する列がテーブルのトランザクション速度にどのように影響するかについて、パフォーマンスの問題はありません。

かなりの数のPostgreSQLの「テーブルの更新」の例を調べ、ここでマニュアルも確認しました。ただし、複数の条件を使用した更新手順の例はまだ見つかりませんでした。これがここで必要なことだと思います。

または、私が完全に間違っていて、ソリューションにSQL関数またはトリガー、ヒントや提案が必要な場合がありますか?

4

2 に答える 2

5

SQLフィドル

select
    c1, c2, c3, c4,
        (coalesce(c1, '') = 'Y')::integer
        + (coalesce(c2, '') = 'Y')::integer
        + (coalesce(c3, '') = 'Y')::integer
        + (coalesce(c4, '') = 'Y')::integer
    total_Y,
        (c1 is null)::integer
        + (c2 is null)::integer
        + (c3 is null)::integer
        + (c4 is null)::integer
    total_null
from t
于 2013-03-26T17:09:54.857 に答える
2

偶然の一致として、sum関数はまさにあなたが探している振る舞いをしています。値を行に変換する必要があります。

UPDATE some_table SET summary = (SELECT SUM(v::int) FROM (VALUES (col1),(col2),(col3),(col4)) as x(v));
于 2013-03-26T17:12:07.933 に答える