在 SQL 中将 AND 或 OR 放在一个条件中
Posted
技术标签:
【中文标题】在 SQL 中将 AND 或 OR 放在一个条件中【英文标题】:Putting AND or OR in one condition in SQL 【发布时间】:2020-09-29 13:37:29 【问题描述】:我有一个EMPLOYEE
表,它返回一个EMPLOYEE_type
。 EMPLOYEE_type
的值可以是 1 或 2。
我有另一个表DISCOUNT
,其中我们有列DISCOUNT_EMPLOYEE_TYPE
。 DISCOUNT_EMPLOYEE_TYPE
的值可以是 1、2 或 NULL(不存在)。
我必须找到下面的结果。
如果EMPLOYEE_type = 2
则显示所有DISCOUNT
和DISCOUNT_EMPLOYEE_TYPE = 2
。
如果EMPLOYEE_type = 1
则显示所有DISCOUNT
与DISCOUNT_EMPLOYEE_TYPE = 1
或NULL。
到目前为止,我已经尝试过以下查询:
DECLARE @employee_type smallint
SET @employee_type = (SELECT employee_type FROM [dbo].[EMPLOYEE] (nolock)
AND employee_stub = @employee_stub)
SELECT *
FROM [dbo].[DISCOUNT] (nolock)
WHERE acct_id = @acct_id
AND (discount_employee_type = @employee_type
OR (@employee_type IS NULL AND @employee_type = 1))
如果@employee_type = 2
返回正确的结果。
但是,在 @employee_type = 1
的情况下它不会返回 NULL 值 - 我只返回带有 discount_employee_type = 1
的行。
【问题讨论】:
= null
?那永远不会返回true。你想要is null
。
我也试过 wilh is null
,它还没有给出结果
其实(@employee_type is null and @employee_type=1)
永远不会成功
你为什么对你的两个表都使用NOLOCK
?您对可能存在错误的数据感到满意吗?
【参考方案1】:
根据您的描述,我建议 WHERE 子句应该是
WHERE
acct_id = @acct_id
and (
(employee_type = 2 AND discount_employee_type = 2)
OR (@employee_type = 1 AND (discount_employee_type = 1 OR discount_employee_type IS NULL))
)
【讨论】:
【参考方案2】:在 WHERE 子句中使用 CASE 表达式来检查 2 个条件中的每一个:
SELECT *
FROM [dbo].[DISCOUNT]
WHERE acct_id = @acct_id
AND 1 = CASE
WHEN @employee_type = 1 AND COALESCE(discount_employee_type, 1) = 1 THEN 1
WHEN @employee_type = 2 AND discount_employee_type = 2 THEN 1
END
【讨论】:
【参考方案3】:更正了我的代码:
declare @employee_type int
declare @discount table
(
col1 int
,discount_employee_type varchar(1)
)
--set @employee_type = 1
set @employee_type = 2
insert into @discount(col1,discount_employee_type)
values (1,'1'), (2,'1'), (3,'2'), (4,null), (5,'2')
select * from @discount
select *
from
@discount
WHERE
1 =
CASE
WHEN @employee_type = 1 and (discount_employee_type is null or discount_employee_type = 1) then 1
WHEN @employee_type = 2 and discount_employee_type = 2 THEN 1
ELSE 0
END
DBFiddle link here
【讨论】:
以上是关于在 SQL 中将 AND 或 OR 放在一个条件中的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring Boot 中将属性放在 application.yml 或 bootstrap.yml 上有啥区别?