2011-12-29 73 views
1

我要計算這樣縮短SQL查詢

((('a' or 'b') AND ('c' or 'd') AND ('e' or 'f')) IN (SELECT COLUMN1 FROM...)) 

(「A」,「B」 ......都是字符串)

當然是一個布爾表達式,如果我寫這樣的一個查詢,SQL Server會拋出錯誤,因爲'a','b'...不是布爾類型。

誰能幫我寫一個短的查詢來計算比下面一個表達式:

((('a' in (select..)) or (('b' in (select...))) AND ((('c' in (select..)) or (('d' in (select...))) AND ((('e' in (select..)) or (('f' in (select...)))

感謝。

`EDIT: add more infor about my query` 

這是我的查詢(當然它因此未工作)

SELECT ID, Name, Addr, PhoneNumber, Descr FROM CusInfo 
WHERE Type_ID = 'type_01' 
AND `((('a' or 'b') AND ('c' or 'd') AND ('e' or 'f')) IN (SELECT Cri_ID FROM CusCri WHERE CusCri.Cus_ID = CusInfo.ID))` 

所有我想要的是計算(('a' or 'b') AND ('c' or 'd') AND ('e' or 'f')) IN (SELECT Cri_ID FROM CusCri WHERE CusCri.Cus_ID = CusInfo.ID)作爲一個布爾值。

+0

向我們展示更多的代碼,所以我們可以看到有可能縮短SQL代碼 – Nonym 2011-12-29 18:49:44

+0

更新我的回答下面的詳細信息。 – 2011-12-29 19:46:51

回答

1

嘗試(更新,以下修改問題):

SELECT ID, Name, Addr, PhoneNumber, Descr FROM CusInfo i 
WHERE Type_ID = 'type_01' AND 
     3 = (select count(distinct case when c.Cri_ID in ('a','b') then 1 
             when c.Cri_ID in ('c','d') then 2 
             when c.Cri_ID in ('e','f') then 3 
           end) 
      from CusCri c 
      WHERE c.Cus_ID = i.ID and c.Cri_ID in ('a','b','c','d','e','f')) 
+0

謝謝你! – Wayne 2011-12-29 20:16:26

2

UPDATE 看到實際的表結構之後,這應該工作:

SELECT 
    ID, 
    Name, 
    Addr, 
    PhoneNumber, 
    Descr, 
    MeetsCriteria = (CASE WHEN COUNT(CI.Cus_ID) > 0 THEN 1 ELSE 0 END) 

FROM CusInfo CI 
    LEFT OUTER JOIN CusCri CC ON CusInfo.ID = CusCri.Cus_ID 

WHERE [Type_ID] = 'type_01' 
    AND (CusCri.Cri_ID = 'a' OR CusCri.Cri_ID 'b') 
    AND (CusCri.Cri_ID = 'c' OR CusCri.Cri_ID 'd') 
    AND (CusCri.Cri_ID = 'e' OR CusCri.Cri_ID 'f') 

GROUP BY 
    ID, 
    Name, 
    Addr, 
    PhoneNumber, 
    Descr, 
    CusCri.Cri_ID 

OLD答案 - 離開了參考

自連接可能比一堆IN陳述快(測試看看)。

SELECT MT1.* FROM MyTable MT1 
    INNER JOIN MyTable MT2 ON MT1.Column1 = MT2.Column1 AND MT1.Column1 = 'A' OR MT1.Column1 = 'B' 

etc... 

我需要看到的數據結構,知道這是一個可行的方法還是不行。

這是一個更具體的例子,我創建了一些我自己的真實數據;如果是而不是用於通配符的文本數據(特別是不可破解的「%T」),我只會認爲這是一個很好的做法,但它是演示它的最簡單方法。

SELECT SE1.Caption FROM SearchEntity SE1 
INNER JOIN SearchEntity SE2 ON SE1.Caption = SE2.Caption 
    AND 
    (
     -- starts with A or B 
     (SE1.Caption LIKE 'A%' OR SE2.Caption LIKE 'B%') 
     -- starts with C and ends with T 
     OR (SE1.Caption LIKE 'C%' AND SE1.Caption LIKE '%T') 
    ) 
+0

謝謝你,但這並沒有工作:(:(我已經修復了一些錯誤),我會用馬克的答案 – Wayne 2011-12-29 20:32:01

1

您也許可以使用CTE

with t1(col1) as (SELECT COLUMN1 FROM...) 
select * from t1 
where 'a' in (t1.Col1) or 'b' in (t1.col1) ...etc...