WHERE子句SQL Server中AND和OR的多个条件

时间:2017-01-26 00:15:59

标签: sql-server conditional-statements where clause

我在Microsoft SQL Server Management Studio中工作。我正在使用多个表和多个条件(将近80个),我正在查询我正在尝试实现联接数据的子集。

我的想法是我需要从连接中获取数据,其中数据不是基于条件的不同连接(即NOT IN),然后我需要过滤一堆涉及的条件每列上有多列和多个条件。我的问题(我认为)来自OR条件。我有一个列,比如col5,如果它不满足AND条件中的任何条件,那么我需要对其进行进一步过滤(因此,OR条件)。

到目前为止我所写的内容如下:

SELECT 
    handfulOfColumns
FROM 
    table1 AS t1
LEFT JOIN
    (SELECT *
     FROM table2
     WHERE col2 = 'thing0' or col2 = 'thing1') AS t2 ON t1.col1 = t2.col1
WHERE 
    t1.col1 NOT IN (SELECT t1.col1
                    FROM table1 t1
                    LEFT JOIN table3 t3 ON t1.col1 = t3.col1
                    WHERE col3 LIKE '%thing3%')
    AND (col4 > '#' AND col5 NOT LIKE 'thing4' 
         AND col5 != 'thing5' AND col5 NOT LIKE 'thing6' 
         AND col6 NOT LIKE 'thing7'
         --...
         --... add like 20 lines of conditions similar to above
         --...
         AND col34 NOT LIKE 'thing77' AND LEN(col35) > '#')
     OR (col5 NOT LIKE '% %' AND col5 LIKE '%[a-z]%' 
         AND col5 NOT LIKE '%[0-9]%' 
         AND col5 NOT LIKE 'thing209' 
         AND col5 NOT LIKE 'thing210');

这样做的原因是我在col5处理了很多(杂乱的)电话号码,总体来说,要对所有列进行大量清理工作。这些电话号码中的一些将输入文本,并且根据上下文我可能希望保留或过滤掉它们(例如,将电话号码输入为“商家名称”或“商家”或“alskfjalsdkjf”的情况) ,而不是'555-5555'或'555 5555'等)。如果数据符合AND条件的条件(主要是过滤col5 not like '%555-5555%'的变体),那么我需要通过{col5进一步检查并过滤任何非数字字符{1}}条件。

没有错误消息 - 相反,查询需要很长时间才能完成,并且提供了比我开始时更多的数据行,这与应该发生的事情相反。基于ORtable1的结构,有可能通过连接两个表来引入重复的行,但是我正在做的调节和子设置的数量应该比原来少得多甚至在这里和那里有一些重复的行数。

我不确定我的逻辑在哪里失败,任何帮助都表示赞赏:)

2 个答案:

答案 0 :(得分:0)

除了正确的语法更正marc_s建议,这实际上运行得很好。事实证明我在AND条件中有几个条件陈述不正确(即一些=,其中逻辑上它们应该是!=like它们应该是not like {{1}} 1}})但整体结构和逻辑是合理的 - 重新考虑几个测试数据库,它的工作完美。抱歉,如果这让任何人头疼:)

答案 1 :(得分:0)

即使它提供了正确的结果,您的逻辑看起来也很混乱。为了使查询更具可读性,我会尝试以下方法:

1)如果允许向现有模式添加一些列,则可以添加一些可在查询中重用的有意义的列。你的表格看起来像这样:

create table table1 
(
    Id INT NOT NULL,
    col1 VARCHAR(64),
    col2 VARCHAR(64),
    col3 VARCHAR(64),
    col4 VARCHAR(64),
    col5 VARCHAR(64),

    Thing4Like AS (CASE WHEN col4 > '#' AND col5 NOT LIKE 'thing4' THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END) PERSISTED,
    Thing56 AS (CASE WHEN col5 != 'thing5' AND col5 NOT LIKE 'thing6' THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END) PERSISTED
    -- other columns may come here
)

这使您可以编写更易读的查询,甚至可以更快地查询,因为某些信息是预先计算的。此外,持久列允许索引。

2)如果您无法更改架构,则可以在table1上创建一个包含额外逻辑的视图,如上所示。为了获得额外的性能,它们可以是indexed