3

我正在尝试以下列方式选择一些数据:

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

我想要它做的是如果 b 不等于 b1,请检查 b = b2。但是,如果 b=b1,则不要检查其他条件。此 select 语句的结果必须只有一个条目。但是,在我没有的语句中,它会检查所有三个条件,有时会返回多行。同样,我希望它停止检查条件是否为真。

关于如何实施的任何想法?我试过case,但没有成功...

先感谢您!

编辑这是我正在尝试运行的实际查询。

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 建议的查询中,只有在临时表中有一行时,我才会得到正确的结果。如果还有更多,则会在选择电话部分时引发错误。

“错误代码:1242。子查询返回多于 1 行”

4

2 回答 2

3

通过使用 IF() + IF() + IF(),并测试 sum = 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 的帮助下,我一直忘记逻辑测试分别返回 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 回答