2012-07-09 50 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