3

次の方法でいくつかのデータを選択しようとしています。

SELECT column
FROM table
WHERE a = a1
AND (b = b1 OR b = b2 OR b = b3);

私がやりたいのは、bがb1と等しくない場合、b=b2かどうかを確認することです。ただし、b = b1の場合は、他の条件をチェックしないでください。このselectステートメントの結果は、1つのエントリーのみでなければなりません。ただし、私が持っていないステートメントでは、3つの条件すべてをチェックし、複数の行を返す場合があります。繰り返しになりますが、条件が真であるかどうかのチェックを停止したいと思います。

これをどのように実装できるかについてのアイデアはありますか?ケースを試しましたが、うまくいきませんでした...

前もって感謝します!

編集これは私が実行しようとしている実際のクエリです。

INSERT INTO shipment_flights 
    (airlinename, flt_no, flt_date, destination, phone, depttime, arrivaltime, pcs, weight)
SELECT st.airlinename, flightno, flightdate, destination,     
(SELECT phone 
FROM carrierlocations 
WHERE carriers_carrierid = (select carrierid from carriers where airlinename = st.airlinename) 
AND (city = destination OR (city != destination AND
    city = (SELECT city FROM airports WHERE iataid = 
            (SELECT airports_iataid FROM ratelegs 
                WHERE shipments_shipid = c.shipments_shipid))
                ))) phone, 
depttime, arrivaltime, sum(linepcs), sum(lineweight)
FROM segment_times st
    JOIN contents2flights c2f 
        ON st.flightid = c2f.segments_flights_flightid 
        AND st.segmentid = c2f.segments_segmentid 
    JOIN contents c 
        ON c.lineno = c2f.contents_lineno 
        AND c.shipments_shipid = c2f.contents_shipments_shipid

WHERE c.shipments_shipid = var_shipid
GROUP BY flightid
ORDER BY flightdate, depttime;

出力例は次のとおりです。

airlinename         flt_no  flt_date        destination    phone         pcs   weight
Everts Air Alaska   CH1     2008-02-20      Hughes         9074502351    24    2121

クエリは、フライトデータの束を一時テーブルに挿入します。私が問題を抱えているのは、場所の電話番号を取得することです。この部分は次のとおりです。

(SELECT phone 
FROM carrierlocations 
WHERE carriers_carrierid = (select carrierid from carriers where airlinename = st.airlinename) 
AND (city = destination OR (city != destination AND
    city = (SELECT city FROM airports WHERE iataid = 
            (SELECT airports_iataid FROM ratelegs 
                WHERE shipments_shipid = c.shipments_shipid))))) phone

Amit Bhargavaがアドバイスしたクエリでは、一時テーブルに1つの行がある場合にのみ、正しい結果が得られます。それ以上ある場合は、電話部分の選択でエラーが発生します。

「エラーコード:1242。サブクエリが複数の行を返します」

4

2 に答える 2

3

IF() + IF() + IF() を使用し、合計 = 1 をテストすることで、他の基準ではなく多くの余分なものを防ぐことができます。2 つまたは 3 つすべてが同じ場合、合計は 1 より大きくなります。いずれも一致しない場合、結果は 0 になります。

SELECT column
  FROM table
  WHERE a = a1
    AND  if( b = b1, 1, 0 )
       + if( b = b2, 1, 0 )
       + if( b = b3, 1, 0 ) = 1

または... ypercubeの支援を受けて、論理テストがtrue / falseに対してそれぞれ1または0を返すことを忘れ続けています...

SELECT column
  FROM table
  WHERE a = a1
    AND  (b = b1) + (b = b2) + (b = b3) = 1
于 2012-04-26T01:48:41.287 に答える
1

以下をお試しください。最もエレガントなソリューションではありませんが、うまくいくはずです。

SELECT column
FROM table
WHERE a = a1
AND (b = b1 OR (b != b1 AND (b = b2 OR (b != b2 AND b = b3))))
于 2012-04-26T01:26:18.623 に答える