Sql server SQL Server WHERE子句中AND和OR的多个条件
我在微软SQL Server管理工作室工作。我有多个正在使用的表,以及我正在查询的多个条件(将近80个),我试图在其中实现连接数据的子集 我的想法是,我需要从一个连接中获取数据,其中数据不在基于某个条件的不同连接中(即,Sql server SQL Server WHERE子句中AND和OR的多个条件,sql-server,conditional-statements,where-clause,Sql Server,Conditional Statements,Where Clause,我在微软SQL Server管理工作室工作。我有多个正在使用的表,以及我正在查询的多个条件(将近80个),我试图在其中实现连接数据的子集 我的想法是,我需要从一个连接中获取数据,其中数据不在基于某个条件的不同连接中(即,不在),然后我需要过滤一组涉及多列的条件和每列上的多个条件。我的问题(我想)是由或条件引起的。我有一个列,比如说col5,如果它不满足和条件中的任何条件,那么我需要对它进行进一步的过滤(因此,或条件) 到目前为止,我写了以下内容: SELECT handfulOfCol
不在
),然后我需要过滤一组涉及多列的条件和每列上的多个条件。我的问题(我想)是由或条件引起的。我有一个列,比如说col5
,如果它不满足和
条件中的任何条件,那么我需要对它进行进一步的过滤(因此,或
条件)
到目前为止,我写了以下内容:
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”等)。如果数据符合和
条件的标准(主要过滤掉col5的变化,而不是像“%555-5555%”
),那么我需要通过或
条件进一步检查和过滤col5
中的任何非数字字符
没有错误消息-相反,查询需要很长的时间才能完成,并提供比开始时更多的数据行,这与应该发生的情况相反。根据表1
和表2
的结构,通过连接两个表,有可能引入重复行,但我正在进行的条件和子设置的数量应该远远少于原始行数,即使这里和那里有一些重复
我不确定我的逻辑在哪里失败了,非常感谢您的帮助:)除了marc_建议的正确语法更正之外,这实际上运行得很好。事实证明,我在和条件中有几个条件语句不正确(即,一些=
在逻辑上应该是!=
和类似在逻辑上应该是而不是的地方)但总体结构和逻辑是在几个测试数据库上重新运行的,并且工作得非常完美。如果这让任何人感到头痛,请道歉:)除了marc_建议的正确语法更正之外,这实际上运行得很好。事实证明,我在和条件中有几个条件语句不正确(即,一些=
在逻辑上应该是!=
和类似在逻辑上应该是而不是的地方)但总体结构和逻辑是在几个测试数据库上重新运行的,并且工作得非常完美。如果这让任何人感到头痛,请道歉:)您的逻辑看起来相当混乱,即使它提供了正确的结果。为了使查询更具可读性,我将尝试以下方法:
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) 如果无法更改模式,可以在表1上创建一个视图,其中包含如上所示的额外逻辑。为了获得更高的性能,它们可以是。您的逻辑看起来相当混乱,即使它提供了正确的结果。为了使查询更具可读性,我将尝试以下方法:
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) 如果无法更改模式,可以在表1上创建一个视图,其中包含如上所示的额外逻辑。为了获得更高的性能,它们可以。修复左联接中的子查询,如果它返回的值比原来的多,那么该子查询将返回重复的值。问题是,如果我只运行该联接部分,我将获得大约64K行数据(这将包括重复项,因为table1
本身就有大约60K行数据)。但是,当我添加从WHERE
子句开始的所有条件时,我最终得到了大约67K行数据,从逻辑上讲,我应该得到不到64K的数据。因此,即使考虑重复,它仍然返回比预期更高的值。如果它返回的值比您需要的值多,请修复左联接中的子查询最初有,然后子查询返回重复的数据。问题是,如果我只运行连接部分,我会得到大约64K行数据(包括重复数据,因为table1
本身就有大约60K行数据)但是当我加上从WHERE
子句开始的所有条件时,我得到了大约67K行数据——从逻辑上讲,我应该得到不到64K的数据。因此,即使考虑到重复数据,它的返回量仍然比预期的要高。谢谢!尽管它起作用,但我认为我写的数据相当混乱,而且c我对SQL比较陌生,最近才开始使用它,所以我一直在寻找一种方法来清理一些东西。如果可能的话,尽量写可读的东西,否则你或同事几个月后很难理解发生了什么。这适用于prog