我有一个需要帮助的查询 - 作为表单的一部分,我有一个序列号字段,如果有序列号则填充该字段,如果没有则为空白,或者如果它是无效的序列号则没有结果。
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') 出于明显的原因我得到错误的结果,但想不出一种理智的方式来表达它。非常感谢斯科特