MySQL查询 - 只有确切的结果或每个选择

时间:2012-07-09 04:50:06

标签: mysql

我有一个查询,我需要一些帮助 - 作为表格的一部分,如果有序列号,我会有一个序列号字段,如果不是,则为空白,如果序列号无效,则为空。

select * 
from cust_site_contract as cs 
where cs.serial_no = 'C20050' or (cs.serial_no <> 'C20050' and if(cs.serial_no = 'C20050',1,0)=0)
limit 10;

以下是常规数据的示例:

+----------------------+-----------+-----------+-----------
| idcust_site_contract | system_id | serial_no | end_date
+----------------------+-----------+-----------+-----------
|               561315 | SH001626  | C19244    | 2009-12-21
|               561316 | SH001626  | C19244    | 2010-06-30
|               561317 | SH002125  | C19671    | 2010-05-31
|               561318 | SH001766  | C14781    | 2010-09-25
|               561319 | SH001766  | C14781    | 2011-02-15
|               561320 | SH002059  | C19020    | 2008-07-09
|               561321 | SH002639  | C18889    | 2008-03-31
|               561322 | SH002639  | C18889    | 2008-06-30
|               561323 | SH002715  | C20051    | 2010-04-30
|               561324 | SH002719  | C20057    | 2010-04-30

确切的结果看起来像这样:

|               561487 | SH002837  | C20050    | 2012-07-04

我将此作为子查询编写,因此我可以将system_ids与客户和合同名称相匹配,但意识到我很早就开始收垃圾了。 我很想通过说第三种情况可能不成立来尝试简化它(即如果它是一个无效的序列号,允许选择任何客户名称并只是在数据中标记它) 有没有人知道我哪里出错了?条件的组合显然是错误的,我无法弄清楚如何使或声明的每一面互相排斥 即使我试图只评估if(sn ='blah'),但由于显而易见的原因,我得到了错误的结果,但却想不出一种理智的表达方式。 非常感谢 斯科特

2 个答案:

答案 0 :(得分:1)

如果没有序列号为C20050的合同,此查询将返回所有行,否则,它将仅返回serial_noC20050的一行:

SELECT a.*
FROM cust_site_contract a
INNER JOIN
(
    SELECT COUNT(*) AS rowexists
    FROM cust_site_contract
    WHERE serial_no = 'C20050'
) b ON b.rowexists = 0

UNION ALL

(
    SELECT *
    FROM cust_site_contract 
    WHERE serial_no = 'C20050'
    LIMIT 1
)

答案 1 :(得分:0)

如果您只是按如下方式编写查询,如果不存在或者序列号无效,则会显示空白。

select cs.serial_no from cust_site_contract as cs where cs.serial_no = 'C20050'