Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server WHERE子句中AND和OR的多个条件_Sql Server_Conditional Statements_Where Clause - Fatal编程技术网

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

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

我在微软SQL Server管理工作室工作。我有多个正在使用的表,以及我正在查询的多个条件(将近80个),我试图在其中实现连接数据的子集

我的想法是,我需要从一个连接中获取数据,其中数据不在基于某个条件的不同连接中(即,
不在
),然后我需要过滤一组涉及多列的条件和每列上的多个条件。我的问题(我想)是由
条件引起的。我有一个列,比如说
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