2

次のようなテーブルがあります。

user_id value1 value2 value3 value4
1       2      3      4      null
2       null   5      2      null
3       null   null   100    3
...

ここで、value1、value2、value3、および value4 の最小値を取得し、最小値が最も高い user_id を返したいと考えています。

を使用してから降順でグループ化することを考えましleastたが、null を効率的にチェックするにはどうすればよいですか? テーブルの出力は次のようになります。

user_id value
3       3
1       2
2       2
4

3 に答える 3

3

~0>>1mysql で最大の BigInt 値が得られます (十分なはずです)。

coalesce(
      nullif(
           least(coalesce(value1, ~0>>1), coalesce(value2, ~0>>1),
                 coalesce(value3, ~0>>1), coalesce(value4, ~0>>1)), 
      ~0>>1), 
0)

または、組み合わせを行う必要があります(すべてを入れますが、必要かどうかはわかりません)

coalesce
    (least(
       coalesce(value1, value2, value3, value4), 
       coalesce(value1, value2, value4, value3),
       coalesce(value1, value3, value2, value4),
       coalesce(value1, value3, value4, value2),
       coalesce(value1, value4, value2, value3),
       coalesce(value1, value4, value3, value2),
       coalesce(value2, value1, value3, value4),
       coalesce(value2, value1, value4, value3),
       coalesce(value2, value3, value1, value4),
       coalesce(value2, value3, value4, value1),
       coalesce(value2, value4, value1, value3),
       coalesce(value2, value4, value3, value1),
       coalesce(value3, value1, value2, value4),
       coalesce(value3, value1, value4, value2),
       coalesce(value3, value2, value1, value4),
       coalesce(value3, value2, value4, value1),
       coalesce(value3, value4, value1, value2),
       coalesce(value3, value4, value2, value1),
       coalesce(value4, value1, value2, value3),
       coalesce(value4, value1, value3, value2),
       coalesce(value4, value2, value1, value3),
       coalesce(value4, value2, value3, value1),
       coalesce(value4, value3, value1, value2),
       coalesce(value4, value3, value2, value1)
)

、0)

于 2012-07-06T08:35:27.533 に答える
1

であることへの引数のいずれかがある場合least()NULL全体の結果は になりますNULL。あなたの場合、NULL結果をゼロ(0)に簡単に変換できます。これは最小のようです:

SELECT coalesce(least(value1, value2, value3, value4), 0)
  FROM table;

フィールドに別のデフォルトを設定したい場合は、それらを個別のcoalesce()呼び出しにラップする必要があります。

SELECT coalesce(least(value1, coalesce(value2, 2), value3, value4), 0)
  FROM table;

移植性が高いため、coalesce()代わりに使用しています。isnull()

于 2012-07-06T08:37:13.960 に答える
1

使用COALESCE() する 最初の非 NULL 引数を返します

 SELECT COALESCE(LEAST(`value1`,`value2`,`value3`),0) AS min ...
于 2012-07-06T08:35:38.537 に答える