我有一个需要帮助的查询 - 作为表单的一部分,我有一个序列号字段,如果有序列号则填充该字段,如果没有则为空白,或者如果它是无效的序列号则没有结果。
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 与客户和合同名称相匹配,但我很早就意识到我得到了垃圾。我很想尝试通过说第三种情况可能不成立来简化它(即,如果它是无效的序列号,允许选择任何客户名称并简单地在数据中标记它)有没有人知道我在哪里会出错吗?条件的组合显然是错误的,我无法弄清楚如何使 or 语句的每一侧互斥即使我尝试仅评估 if(sn = 'blah') 出于明显的原因我得到错误的结果,但想不出一种理智的方式来表达它。非常感谢斯科特