2017-05-02 6 views
0

PHP経由のフォーム入力に合わせていくつかのPostgreSQL SELECTクエリがあります。これらのうちの1つは、各フィールド内の最小値を検索するSELECTクエリです(また、最大値を検出するクエリもあります)。同じテーブルDO/DONTの他のカラムがNULLの場合、カラムのMIN/MAXを見つける

最小値の場合:

SELECT 
    MIN(col1) "Min_col1" 
    MIN(col2) "Min_col2" 
    MIN(col3) "Min_col3" 
FROM table 

残念ながら、テーブル内には、すべてのフィールドにかなりのNULL値があります。これに対処するために、このクエリの一部としてNULL値を含める/除外するかどうかをユーザーが選択できるように、フォームにチェックボックスを追加しました。ユーザがすべての列のNULL値を含めるしたい場合

たとえば、:フィールドの各々は、少なくとも一つのNULL値を有するので

SELECT 
    MIN(col1) "Min_col1" 
    MIN(col2) "Min_col2" 
    MIN(col3) "Min_col3" 
FROM table 
WHERE 
    (col1 IS NULL) AND 
    (col2 IS NULL) AND 
    (col3 IS NULL) 

しかし、上記のクエリは、すべてのNULLSを返します。

私が代わりに好きなのは、各フィールドのMINを取り出すことができ、他のフィールドにNULL値を含めるか除外することです。例えばMIN2(col1)col2のNULLSを含める/除外するcol2 & col3など

これについては、最も簡単な方法は?クエリはPHPを介してフォーム入力から集められているので、できるだけモジュール式にしておきたいと思います。

+0

あなたはこれをチェックしてください - http://stackoverflow.com/questions/12009817/sql-selecting-min-value-from-row-data-with-null-values –

+0

役に立つ:http://stackoverflow.com/質問/ 19029842/if-then-else-statements-in-postgresql –

+0

分を選択します( 'Include' = {parameter}の場合、col2がnullの場合は0、そうでない場合はcol2が終了するelse = col2 end) from your_table {parameter}の値は 'Include'または 'Exclude'です。これらの値は、チェックボックスのパラメータを使用して設定します。それが働いているかどうか私に教えてください。 –

答えて

1

を使用したい、分、それ以外はnullを返します。ここ

SELECT 
    case when not null_only then MIN(col1) else null end "Min_col1" 
    , case when not null_only then MIN(col2) else null end "Min_col2" 
    , case when not null_only then MIN(col3) else null end "Min_col3" 
FROM table 
WHERE 
    (col1 IS NULL) AND 
    (col2 IS NULL) AND 
    (col3 IS NULL) 

は、準備されたステートメントの例を働いています:

t=# prepare q1 (boolean) as select case when not $1 then MIN(oid) else null end col1 from pg_class; 
PREPARE 
Time: 10.905 ms 
t=# execute q1(true); 
col1 
------ 

(1 row) 

Time: 6.216 ms 
t=# execute q1(false); 
col1 
------ 
    112 
(1 row) 

Time: 7.169 ms 
0

値がnullでないことを確認したい場合は、coalesce(columnName 、valueToBeUsed)。だからあなたの例では、あなたはおそらくnull_only ::ブールがfalseの場合は、以下のクエリに対してMIN(coalesce(col1,0))

関連する問題