SQL Server WHERE子句-通知
我试图在一个包含多个选项的SQL脚本中获得结果。我终于得到了我需要的结果SQL Server WHERE子句-通知,sql,sql-server-2008,Sql,Sql Server 2008,我试图在一个包含多个选项的SQL脚本中获得结果。我终于得到了我需要的结果 where (RTRIM(FMLS.REGION)) IN (@Region) and (RTRIM(FMB0.COUNTRY))IN (@Country) and (RTRIM(FMB0.SITECODE)) IN (@Site) and (RTRIM(FMB0.BLDGCODE)) IN (@Building) and ( ( (RTRIM(FMA0.SPACETYPE) NOT IN ('A-OF
where
(RTRIM(FMLS.REGION)) IN (@Region) and
(RTRIM(FMB0.COUNTRY))IN (@Country) and
(RTRIM(FMB0.SITECODE)) IN (@Site) and
(RTRIM(FMB0.BLDGCODE)) IN (@Building) and
(
(
(RTRIM(FMA0.SPACETYPE) NOT IN ('A-OFF-AS','A-WKS-AS') AND ((RTRIM(FMA0.SPCODE) <> '') AND (FMA0.SPCODE IS NOT NULL)))
AND
(RTRIM(FMA0.SPACETYPE) NOT LIKE 'CR-%' AND ((RTRIM(FMA0.SPCODE) <> '') AND (FMA0.SPCODE IS NOT NULL)))
)
OR
(
(RTRIM(FMA0.SPACETYPE) = 'A-OFF-AS' AND RTRIM(FMA0.SPCODE) NOT LIKE 'A-OFF-%') OR
(RTRIM(FMA0.SPACETYPE) = 'A-WKS-AS' AND RTRIM(FMA0.SPCODE) NOT LIKE 'A-WKS-%')OR
(RTRIM(FMA0.SPACETYPE) LIKE 'CR-%' AND RTRIM(FMA0.SPCODE) NOT LIKE 'CR-%')
)
)
在哪里
(RTRIM(FMLS.区域))位于(@区域)和
(RTRIM(FMB0.国家))位于(@国家)和
(@Site)中的(RTRIM(FMB0.SITECODE))和
(@建筑)中的(RTRIM(FMB0.BLDGCODE))和
(
(
(RTRIM(FMA0.SPACETYPE)不在('A-OFF-AS','A-WKS-AS')和((RTRIM(FMA0.SPCODE)')和(FMA0.SPCODE不为空)))
及
(RTRIM(FMA0.SPACETYPE)不象'CR-%'和((RTRIM(FMA0.SPCODE)')和(FMA0.SPCODE不为NULL)))
)
或
(
(RTRIM(FMA0.SPACETYPE)='A-OFF-AS'和RTRIM(FMA0.SPCODE)与'A-OFF-%'不同)或
(RTRIM(FMA0.SPACETYPE)='A-WKS-AS'和RTRIM(FMA0.SPCODE)与'A-WKS-%'不同)或
(RTRIM(FMA0.SPACETYPE)与'CR-%'类似,而RTRIM(FMA0.SPCODE)与'CR-%'不同)
)
)
但我关心的是,在这两行中,需要使用AND
(RTRIM(FMA0.SPACETYPE) NOT IN ('A-OFF-AS','A-WKS-AS') AND ((RTRIM(FMA0.SPCODE) <> '') AND (FMA0.SPCODE IS NOT NULL)))
AND
(RTRIM(FMA0.SPACETYPE) NOT LIKE 'CR-%' AND ((RTRIM(FMA0.SPCODE) <> '') AND (FMA0.SPCODE IS NOT NULL)))
(RTRIM(FMA0.SPACETYPE)不在('A-OFF-AS','A-WKS-AS')和((RTRIM(FMA0.SPCODE)')和(FMA0.SPCODE不为空)))
及
(RTRIM(FMA0.SPACETYPE)不象'CR-%'和((RTRIM(FMA0.SPCODE)')和(FMA0.SPCODE不为NULL)))
我认为应该是OR,因为我希望得到两行的FMA0.SPCODE都为空或null的结果,如下所示
(RTRIM(FMA0.SPACETYPE) NOT IN ('A-OFF-AS','A-WKS-AS') AND ((RTRIM(FMA0.SPCODE) <> '') OR (FMA0.SPCODE IS NOT NULL)))
OR
(RTRIM(FMA0.SPACETYPE) NOT LIKE 'CR-%' AND ((RTRIM(FMA0.SPCODE) <> '') OR (FMA0.SPCODE IS NOT NULL)))
(RTRIM(FMA0.SPACETYPE)不在('A-OFF-AS','A-WKS-AS')和((RTRIM(FMA0.SPCODE)')或(FMA0.SPCODE不为空)))
或
(RTRIM(FMA0.SPACETYPE)与'CR-%'和((RTRIM(FMA0.SPCODE)')或(FMA0.SPCODE不为NULL))不同)
但是如果我这样做,我会得到错误的结果。我想不出来,可能是看得太久了,或者括号放错了地方,但我看不出我做错了什么……请帮帮我,这让我发疯了
和
和带有否定表达式的或
在逻辑上有点复杂。如果你说:
SPACETYPE NOT IN ('A-OFF-AS','A-WKS-AS') OR SPACETYPE NOT LIKE 'CR-%'
然后所有SPACETYPE
都将通过此测试。考虑一个值,如<代码>这个“”,它不在第一个列表中,所以没问题。考虑一个值,如<代码> 'Af'作为'< /代码>。它位于第一个列表中,因此第一个条件失败。那么,转到第二个条件。没有匹配,所以它通过了。您可以在许多不同的值上尝试此操作,您会发现或
将传递所有内容。事实上,上述逻辑相当于:
NOT (SPACETYPE IN ('A-OFF-AS','A-WKS-AS') AND SPACETYPE LIKE 'CR-%')
显然,和
从来都不是真的,所以不是
是假的。(注意:此讨论忽略NULL
值。)
因此,或
不起作用。让你高兴的是,和
做了你想做的事。你只需要习惯复杂的布尔逻辑