2012-07-09 54 views
0

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

+0

难道也许是更简单的有两个查询?尝试并得到你的特定结果(选择* where serial_no == XXXXXX),然后如果你没有得到结果(或者0,或null或者你想测试的任何东西),那么你可以做一个查询来获得每一个选择)? – nbsp 2012-07-09 04:56:26

+0

我不确定我是否完全理解你的问题。如果没有序列号等于'C20050',你是否希望查询返回所有行,但是如果有的话只返回一行? – 2012-07-09 05:00:08

+0

嗨赞恩 - 没错。 – Scott 2012-07-09 05:54:47

回答

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

在工会的下半部分需要包装器“SELECT”吗? http://bizackflowflow.com/a/1415380/260007 – biziclop 2012-07-09 05:24:12

+0

@biziclop:不,我猜这不是。谢谢你! – 2012-07-09 05:26:24

+0

谢谢赞恩 - 这是完美的谢谢 它只是返回我后 - 我不知道你可以执行一个子查询的内部联接! – Scott 2012-07-09 06:01:04

0

如果你只是写下面的查询,如果不存在或者它是一个无效的序列号,你会得到空白。

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

嗨克林顿 - 不是真的,如果没有提供序列号,我需要返回所有结果。第三种可能性是当且仅当提供无效序列时才返回结果。 – Scott 2012-07-09 05:56:20

+0

@Scott,什么将构成一个有效的序列号(特定数量的字符?,数字?等)? – 2012-07-09 06:00:59

+0

嗨赞恩 - 有效的序列号是有效的4位十六进制数字,5位字母数字,8位整数或12位整数的形式,这使得它有点混乱;)我正在试图对支持权利号码进行标准化,因为序列号并不是软件问题的严格要求,只是针对硬件问题,但这太复杂了,无法立即解决 - 我宁愿让用户在登录时只需查找一个号码一个事件,而不是在一个加密狗上看一个小银色贴纸,或者在一台服务器的背面上贴一张蓝色标签 – Scott 2012-07-09 22:15:56