2

私の以前の問題と解決策:

フィールドから最大値と最小値を取得

これは問題なく機能しますが、この例では0とNULLをスキップしたいと思います。

例えば:

First:
id | title 
1  | aaa
2  | bbb
3  | ccc

Second:
id | first_id | one | two    | three | four
1  |    1     | 3   | 0      | 4     | 6
2  |    2     | 4   | 4      | 1     | 2
3  |    3     | 1   | NULL   | 3     | 4

これは私に表示する必要があります:

id | title | min | max 
1  | aaa   |  3  | 6
2  | bbb   |  1  | 4
3  | ccc   |  1  | 4

ではなく

id | title | min | max 
1  | aaa   |  0  | 6
2  | bbb   |  1  | 4
3  | ccc   |  0  | 4

前の質問のどの例で、スキップ0とNULLを実装するのに最適な方法ですか?

4

5 に答える 5

1

これらをあなたの条項に入れてください

SELECT 
    f.id, 
    f.title
    MIN(LEAST(greatest(coalesce(s.one,0),1), greatest(coalesce(s.two,0),1), greatest(coalesce(s.three,0),1), greatest(coalesce(s.four,0),1))) as min,
    MAX(GREATEST(greatest(coalesce(s.one,0),1), greatest(coalesce(s.two,0),1), greatest(coalesce(s.three,0),1), greatest(coalesce(s.four,0),1))) as max
FROM 
    First f
        INNER JOIN Second s
        on f.id = s.first_id
GROUP BY 
    f.id, 
    f.title

coalesce(fieldName, 1)nullを1に変換するために使用できます。

繰り返しますが、前の質問で述べたように、これは回答を強制するためのクエリの恐ろしい使用です。データベースのレイアウトを変更する必要があります。

編集:必要なデータを削除しましたが、それを見る前に、同僚の1人がこのようなスクリプトを作成すると、その場で解雇されることに注意してください。これはHIDEOUSであり、使用しないでください。

select
    f.id,
    f.title,
    (select min(z.myVal) from
        (
select
    b.id,
    b.first_id,
    b.one as myVal
from
    second b
where
    b.one is not null
    and b.one > 0
union
select
    b.id,
    b.first_id,
    b.two as myVal
from
    second b
where
    b.two is not null
    and b.two > 0
union
select
    b.id,
    b.first_id,
    b.three as myVal
from
    second b
where
    b.three is not null
    and b.three > 0
union
select
    b.id,
    b.first_id,
    b.four as myVal
from
    second b
where
    b.four is not null
    and b.four > 0
        ) z
    where
    f.id=z.first_id) as miniVal,
    greatest(
        coalesce(s.one,0),
        coalesce(s.two,0),
        coalesce(s.three,0),
        coalesce(s.four,0)  
    ) as maxiVal
from
    first f,
    second s
where
    f.id=s.first_id

出力データ

+------+-------+---------+---------+
| id   | title | miniVal | maxiVal |
+------+-------+---------+---------+
|    1 | aaaa  |       3 |       6 |
|    2 | bbbb  |       1 |       4 |
|    3 | cccc  |       1 |       4 |
+------+-------+---------+---------+
3 rows in set (0.00 sec)

このクエリを実行すると、口の中に少し吐きました。このようにSQLを書くのは間違っています。

于 2012-07-09T09:53:47.683 に答える
1

一見不格好に見えますが、このソリューションは機能するはずです。

SELECT 
    a.id, a.title, MIN(b.num) AS min, MAX(b.num) AS max
FROM 
    first a
LEFT JOIN
(
    SELECT first_id, one AS num FROM second UNION ALL
    SELECT first_id, two FROM second UNION ALL
    SELECT first_id, three FROM second UNION ALL
    SELECT first_id, four FROM second 
) b ON 
    a.id = b.first_id AND 
    b.num IS NOT NULL AND 
    b.num > 0
GROUP BY 
    a.id, a.title

これは、実際には各数値列を独自の行に取得しますが、nullではなく> 0の数値のみGROUP BYを取得します。の前の結果は、次のLEFT JOINようになります。

id  |  title  |  num
---------------------
1   |  aaa    |  3
1   |  aaa    |  4
1   |  aaa    |  6
2   |  bbb    |  1
2   |  bbb    |  2
2   |  bbb    |  4
2   |  bbb    |  4
3   |  ccc    |  1
3   |  ccc    |  3
3   |  ccc    |  4

次に、各first( )のグループ化により、列のおよび集計関数をGROUP BY a.id, a.title使用して、グループごとの最小値と最大値を抽出できます。MIN()MAX()numfirst

id  |  title  |  min  |  max
----------------------------
1   |  aaa    |  3    |  6
2   |  bbb    |  1    |  4
3   |  ccc    |  1    |  4

aに'sまたは'sfirst_idを持つ4つの列すべてがある場合、最小値と最大値は、の代わりに使用するために表示されます。これは、状況に適した動作であると私は信じています。NULL0NULLLEFT JOININNER JOIN

id  |  title  |  min  |  max
----------------------------
4   |  ddd    |  NULL |  NULL
于 2012-07-09T10:10:17.610 に答える
0

使用する:

WHERE COLUMN IS NOT NULL AND COLUMN <> 0;
于 2012-07-09T10:00:04.077 に答える
0

使用できますIFNULL()

WHERE IFNULL(fieldname, 0) != 0
于 2012-07-09T10:26:33.403 に答える
0

LEAST 式をネストするだけでよいと思います。

LEAST(
    NULLIF(one,0),
    LEAST(
        NULLIF(two,0),
            LEAST(
                NULLIF(three,0),
                LEAST(
                    NULLIF(four,0),
                    null ))))

編集私はちょうどそれを見ました。LEAST 関数は複数の引数を取ります。

LEAST( NULLIF(one,0), NULLIF(two,0), NULLIF(three,0), NULLIF(four,0))

編集 2最小値と最大値の両方が必要なようです。明らかに、必要に応じて LEAST を GREATEST に、または MIN を MAX に変更するだけです。

これはより簡単かもしれませんし、便利な最小関数を持っていないかもしれません。

SELECT
    f.id, f.title,
    (
        SELECT MIN(NULLIF(val, 0))
        FROM
            (
                SELECT one AS val UNION ALL
                SELECT two UNION ALL
                SELECT three UNION ALL
                SELECT four
            ) AS vals
        ) 
    ) as minval

FROM First f INNER JOIN Second s on f.id = s.first_id

4 つの列すべてが null/0 になる可能性があるかどうかを指定していません。その場合は微調整が必​​要になる場合があります。

于 2012-07-09T16:33:29.057 に答える