0

我有一个需要帮助的查询 - 作为表单的一部分,我有一个序列号字段,如果有序列号则填充该字段,如果没有则为空白,或者如果它是无效的序列号则没有结果。

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') 出于明显的原因我得到错误的结果,但想不出一种理智的方式来表达它。非常感谢斯科特

4

2 回答 2

1

如果没有序列号为 的合同C20050,则此查询将返回所有行,否则,它将仅返回一行,其中serial_nois 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
)
于 2012-07-09T05:06:48.870 回答
0

如果您只编写如下查询,如果不存在或序列号无效,您将获得空白。

select cs.serial_no from cust_site_contract as cs where cs.serial_no = 'C20050'
于 2012-07-09T05:03:01.100 回答