4

私は次のコードを持っています:

SELECT q25, (
(
AVG( q1 ) + AVG( q2 ) + AVG( q3 ) ) /3 ) AS Overall
FROM t_results
WHERE brand =  'XYZ'
AND DATE =  'MAY2012'
GROUP BY q25
ORDER BY Overall 
DESC LIMIT 1

クエリでデータが見つからない場合、phpmyadminは次のメッセージを返します(これは非常に正しいです)。

MySQL returned an empty result set (i.e. zero rows). ( Query took 0.0178 sec )

しかし、私が欲しいのは実際にNULL値を返すことです、これは可能ですか?これはベストプラクティスではないかもしれませんが、継承されたコードを使用しているので、これがソリューションへの単純で最速のルートになる可能性があります。

いつもありがとう、

H。

4

3 に答える 3

3

ちょうど1行のテーブルを作成します。次に、左結合を使用して目的の結果を得ることができますNULL

CREATE TABLE dummy (d TINYINT NOT NULL);
INSERT INTO dummy SET d = 1;

SELECT q25,
       ( ( AVG( q1 ) + AVG( q2 ) + AVG( q3 ) ) /3 ) AS Overall
FROM dummy LEFT JOIN t_results
  ON brand = 'XYZ'
 AND DATE = 'MAY2012'
GROUP BY q25
ORDER BY Overall DESC
LIMIT 1

ダミーテーブルをサブクエリに置き換えることもできます。

SELECT q25,
       ( ( AVG( q1 ) + AVG( q2 ) + AVG( q3 ) ) /3 ) AS Overall
FROM (SELECT 1) AS dummy LEFT JOIN t_results
  ON brand =  'XYZ'
 AND DATE =  'MAY2012'
GROUP BY q25
ORDER BY Overall DESC
LIMIT 1

sqlfiddleを介してこれをテストしました。ここでは、別の方法を試すこともできます。

以前は条項に含まれていた結果を選択する条件がWHERE、今では条項に含まれている必要がありONます。そうしないと、左結合によって非行が生成され、一致する行が見つからない場合に単一の行が生成されるのではなく、NULLによって削除されます。元のクエリに条件がなかった場合は、を使用して表現できます。WHERENULLWHEREON 1any row matches

于 2012-07-24T11:21:41.483 に答える
2

UNIONと組み合わせて使用​​してLIMITNULL値を指定できます。

(SELECT q25,
        (AVG(q1) + AVG(q2) + AVG(q3))/3 AS Overall
 FROM t_results
 WHERE brand = 'XYZ'
 AND DATE = 'MAY2012'
 GROUP BY q25
 ORDER BY Overall DESC
 LIMIT 1
)
UNION ALL
(SELECT NULL, NULL)
LIMIT 1;

ただし、これは、最初のクエリで複数の結果が得られないことがわかっている場合にのみ機能します。これがここに当てはまるので、これがあなたにとって最良の解決策かもしれませんが、私の他の答えで与えられたアプローチはより一般的です。

これを実験するためのフィドルがあります。

于 2012-07-24T12:04:23.020 に答える
0

このcoalesce()関数を使用して、コンマで区切られた多数の列または文字列から最初のnull以外の値を返すことができます。値/列は左から右に評価されるため、null以外の引数に文字列をポップする場合は、テスト対象の列の右側に配置するようにしてください。

select
    coalesce(
    (
    SELECT
        q25
    FROM 
        t_results
    WHERE 
        brand =  'XYZ'
        AND DATE =  'MAY2012'
    GROUP BY 
        q25
    LIMIT 1
    ), 'null') as q25,
    coalesce(
    (
    SELECT 
        ((AVG( q1 ) + AVG( q2 ) + AVG( q3 ) ) /3 ) AS Overall
    FROM t_results
    WHERE 
        brand =  'XYZ'
        AND DATE =  'MAY2012'
    LIMIT 1
    ), 'null') as Overall
from 
    t_results
group by 
    1, 2;

where句に一致するデータがない場合、これはnull, null行として返されます。

于 2012-07-24T10:50:05.420 に答える