我有一个查询,我需要一些帮助 - 作为表格的一部分,如果有序列号,我会有一个序列号字段,如果不是,则为空白,如果序列号无效,则为空。
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'),但由于显而易见的原因,我得到了错误的结果,但却想不出一种理智的表达方式。 非常感谢 斯科特
答案 0 :(得分:1)
如果没有序列号为C20050
的合同,此查询将返回所有行,否则,它将仅返回serial_no
为C20050
的一行:
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'