缩短SQL查询

时间:2011-12-29 18:45:39

标签: sql sql-server

我想计算一个像这样的布尔表达式

((('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)计算为布尔值。

3 个答案:

答案 0 :(得分:2)

<强>更新 看到实际的表结构后,这应该有效:

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 ANSWER - 留待参考

自连接可能比一堆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' ) 
    )

答案 1 :(得分:1)

您可以使用CTE

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

答案 2 :(得分: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') )
相关问题