在 SQL 中将 AND 或 OR 放在一个条件中

Posted

技术标签:

【中文标题】在 SQL 中将 AND 或 OR 放在一个条件中【英文标题】:Putting AND or OR in one condition in SQL 【发布时间】:2020-09-29 13:37:29 【问题描述】:

我有一个EMPLOYEE 表,它返回一个EMPLOYEE_typeEMPLOYEE_type 的值可以是 1 或 2。

我有另一个表DISCOUNT,其中我们有列DISCOUNT_EMPLOYEE_TYPEDISCOUNT_EMPLOYEE_TYPE 的值可以是 1、2 或 NULL(不存在)。

我必须找到下面的结果。

    如果EMPLOYEE_type = 2 则显示所有DISCOUNTDISCOUNT_EMPLOYEE_TYPE = 2

    如果EMPLOYEE_type = 1 则显示所有DISCOUNTDISCOUNT_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 放在一个条件中的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server中通配符

在 Spring Boot 中将属性放在 application.yml 或 bootstrap.yml 上有啥区别?

是否可以在android中将一个视图放在另一个视图上?

如何在 oracle 中将 select 与 if 条件一起用于不同的表,而不是编写函数或存储过程?

如何在 SQL 中将值显示为 Y 或 N?

在 SQL 中将时间转换为范围