3

私はこのクエリを持っています:

SELECT
    COALESCE(CONCAT(Ar.usaf, '-', Ar.wban),"NONE") AS TABLE_NAME
FROM
    `metadata`.`ISH-HISTORY_HASPOS` A
 INNER JOIN `metadata`.`Artificial` Ar ON (Ar.id = A.mergeId)
WHERE
    A.usaf = usaf
AND A.wban = wban;

結合が発生せず、結果が NULL の場合、クエリが "NONE" で null の結果を COALESCE すると予想していましたが、それでも NULL になります。NULLの代わりに「NONE」が返されるようにするにはどうすればよいですか?

重要な点を説明するのを怠りました: usafandwbanINa の変数ですstored procedure。これが私の最終的な(作業中の)バージョンです。ありがとうローランド

BEGIN
SET @usaf = usaf;
SET @wban = wban;

SELECT
    COALESCE(CONCAT(Ar.usaf, '-', Ar.wban),"NONE") AS TABLE_NAME
FROM
    `metadata`.`ISH-HISTORY_HASPOS` A
 INNER JOIN `metadata`.`Artificial` Ar ON (Ar.id = A.mergeId AND    A.usaf = @usaf AND A.wban = @wban)
LIMIT 1;

END
4

2 に答える 2

3

where次の句があるため、クエリは usaf と wban の NULL 値を考慮しません。

WHERE A.usaf = usaf AND A.wban = wban;

これらの列が NULL の場合、行は除外されます。これはトートロジーにも当てはまりますa.usaf = a.usaf。a.usaf が NULL の場合、そのステートメントは FALSE (まあ、NULL) を返します。

句を削除するwhereと、クエリはおそらく期待どおりに機能します。

2番目のコメントとして。. . inner joinまたはが欲しいleft outer joinですか?

于 2012-12-19T16:02:23.587 に答える
1

WHERE 句に Ar エイリアスを指定します

SELECT
    COALESCE(CONCAT(Ar.usaf, '-', Ar.wban),"NONE") AS TABLE_NAME
FROM
    `metadata`.`ISH-HISTORY_HASPOS` A
 INNER JOIN `metadata`.`Artificial` Ar ON (Ar.id = A.mergeId)
WHERE
    A.usaf = Ar.usaf
AND A.wban = Ar.wban;

このクエリを見ると、3 つの方法で JOIN をさらに改善できます。

まず、WHERE 句の要素を JOIN の ON セクションに追加します。

NULL次に、状況に対応するためにLEFT JOINにします

SELECT
    COALESCE(CONCAT(Ar.usaf, '-', Ar.wban),"NONE") AS TABLE_NAME
FROM
    `metadata`.`ISH-HISTORY_HASPOS` A
    LEFT JOIN `metadata`.`Artificial` Ar
    ON (Ar.id = A.mergeId) AND A.usaf = Ar.usaf AND A.wban = Ar.wban;

第三に、これらのインデックスを追加します

ALTER TABLE `metadata`.`ISH-HISTORY_HASPOS` ADD INDEX (mergeId,usaf,wban);
ALTER TABLE `metadata`.`Artificial` ADD INDEX (id,usaf,wban);

試してみる !!!

于 2012-12-19T16:08:37.247 に答える