关于SQL多条件查询问题: 若其中一条件为空值如何设置忽略该条件而用其它条件组合查询??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于SQL多条件查询问题: 若其中一条件为空值如何设置忽略该条件而用其它条件组合查询??相关的知识,希望对你有一定的参考价值。

最好列举一段代码,多谢了!!

在Oracle多条件查询中包含了空值条件,可采用like关系运算符。
例如:select * from emp where deptno like to_char(变量1)||'%' and
ename like 变量2||'%' and
sal like to_char(变量3)||'%';
如果变量1、变量2、变量3中,有空值的话,就相当于没有这个条件一样了。
参考技术A 这个简单,如果sql语句时页面传进来的,就判断没列是否为空,不为空就拼到sql中。由于不知道你用的是什么语句写的前台,我就用文字表述了。
例如:
基础sql = “select * from table where 1=1”
if (设备类型 不为空)
sql += " and 设备类型 = " + 设备类型值

其他项也是如此。
我之所以写where 1=1 就是为了避免如果所有的想都为空时需要去掉where的问题。本回答被提问者和网友采纳

postgres:如何保护条件表达式免受空值的影响

【中文标题】postgres:如何保护条件表达式免受空值的影响【英文标题】:postgres: How to protect conditional expressions from null values 【发布时间】:2018-01-12 16:41:37 【问题描述】:

在使用 Postgresql 多年之后,我仍然不知道是否存在关于如何保护条件表达式免受变量空值影响的最佳实践,因为 SQL 查询计划者有权应用或忽略最频繁的情况用于防止空值的习惯用法:“var is null or var=0”。

据称,使用“case when ... end”语法可以解决任何歧义,但也降低了可维护性,因为它会用大量单词掩盖一个简单的过程。

谢谢,提前。

【问题讨论】:

var==null 不起作用我想你的意思是var IS NULL 我不确定您的问题是什么并且不会将其标记为重复,但这是我们在条件表达式上处理空参数的常用方式。 ***.com/questions/13078637/… 是的,你是对的,成语“var==null || var==0”是Java代码,我没有说明这一点。也未能说明在 Java(和许多其他非 sql 语言)中,第二个布尔表达式的短路是由语言规范强制的,这意味着如果第一个“var==null”为真,那么第二个“var==0”没有被评估。 你不会在 sql 上得到那么短的电路。你必须像我给你看的样本那样做。或者你可以查看这个版本weblogs.sqlteam.com/jeffs/archive/2007/09/18/… 不确定它对性能有何影响,但您可以使用COALESCE。从您的示例中:COALESCE(var, 0) = 0。你也可以用NULLIF 取反,即。 NULLIF(var, 0) IS NULL 【参考方案1】:

我认为您在将 SQL 与 Java(或 C、C++ 或任何处理引用指针的语言)进行比较时会产生误解。

在使用 SQL 时,您不需要需要保护条件表达式免受NULL 值的影响。

在 SQL 中,您没有(隐藏的)指向应该针对 NULL 进行测试的对象的指针(或引用),否则它们不能被取消引用。在 SQL 中,每个表达式都会产生某个 type 的某个 value。该值可以是NULL(也称为UNKNOWN)。

如果您的varNULL,那么var = 0 将评估为NULLunknown = 0 返回 unknown)。然后var IS NULL (unknown is unknown) 将评估为TRUE。而且,根据三值逻辑,TRUE or UNKNOWN 的计算结果为TRUE。不管是哪种求值顺序,结果都是一样的。

你可以通过评估来检查它:

SELECT
    /* var */ NULL = 0 as null_equals_zero,
    /* var */ NULL IS NULL as null_is_null,
    TRUE or NULL AS true_or_null,
    (NULL = 0) OR (NULL IS NULL) AS your_case_when_var_is_null,
    (NULL IS NULL) OR (NULL = 0) AS the_same_reordered
    ;

返回

null_equals_zero | null_is_null | true_or_null | your_case_when_var_is_null | the_same_reordered :--------------- | :----------- | :----------- | :------------------------- | :----------------- |吨 |吨 |吨 |吨

dbfiddle here

给定var = 0, NULL 和 1 ( 0);你会得到:

WITH vals(var) AS
(
    VALUES
    (0),
    (NULL),
    (1)
)
SELECT
    var,
    var = 0 OR var IS NULL  AS var_equals_zero_or_var_is_null,
    var IS NULL OR var = 0  AS var_is_null_or_var_equals_zero,
    CASE WHEN var IS NULL then true
         WHEN var = 0 then true
         ELSE false
    END                     AS the_same_with_protection
FROM
    vals ;
变量 | var_equals_zero_or_var_is_null | var_is_null_or_var_equals_zero | the_same_with_protection ---: | :----------------------------- | :----------------------------- | :------------------------ 0 |吨 |吨 |吨 |吨 |吨 |吨 1 | f | f | F

dbfiddle here

这些是使用three-valued logic 的不同运算符(NOT、AND、OR、IS NULL、XOR、IMPLIES)的基本真值表,并使用 SQL 进行检查:

WITH three_values(x) AS
(
VALUES 
   (NULL), (FALSE), (TRUE)
)
SELECT
   a, b, 
   a = NULL AS a_equals_null,  -- This is alwaus NULL
   a IS NULL AS a_is_null,     -- This is NEVER NULL
   a OR  b AS a_or_b,          -- This is UNKNOWN if both are
   a AND b AS a_and_b,         -- This is UNKNOWN if any is
   NOT a   AS not_a,           -- This is UNKNOWN if a is
   (a OR b) AND NOT (a AND b) AS a_xor_b,   -- Unknown when any is unknown
   /* (a AND NOT b) OR (NOT a AND b) a_xor_b_v2, */
   NOT a OR b  AS a_implies_b  -- Kleener and Priests logic
FROM
   three_values AS x(a)
   CROSS JOIN
   three_values AS y(b);

这是真值表:

一个 |乙 | a_equals_null | a_is_null | a_or_b | a_and_b | not_a | a_xor_b | a_implies_b :--- | :--- | :------------ | :-------- | :----- | :-------- | :---- | :-------- | :---------- | | |吨 | | | | | | f | |吨 | | f | | | |吨 | |吨 |吨 | | | |吨 f | | | f | | f |吨 | |吨 f | f | | f | f | f |吨 | f |吨 f |吨 | | f |吨 | f |吨 |吨 |吨 吨 | | | f |吨 | | f | | 吨 | f | | f |吨 | f | f |吨 | F 吨 |吨 | | f |吨 |吨 | f | f |吨

dbfiddle here

【讨论】:

乔阿诺洛,嗨。谢谢你的回复。如果我理解正确,逻辑运算符 AND、OR、NOT 如果它们的任何操作数为空,则返回 NULL。因此,NULL 传播。这就是我想要“保护”的东西,但不需要冗长以保持可维护性。 上面的句子应该说明 NULL 传播到 UNKNOWN ...我猜效果是一样的。这个问题在en.wikipedia.org/wiki/Null_(SQL)#Null_propagation 中有很好的描述【参考方案2】:

看来我只是问了一个永远存在的问题。因此,根据 SQL 逻辑表达式中的 NULL 传播问题,以及 sql 优化器不遵守短路结构的额外危险,以及不断发展的 SQL 标准,让我分享一下我目前的发现:

    阅读***的文章SQL NULL PROPAGATION 在任何可能包含空值的列名周围使用coalesce(),参与sql 语句中的任何计算(感谢Igor)。 同时使用 'is [not] distinct from' 代替 '=' 或 ''

【讨论】:

以上是关于关于SQL多条件查询问题: 若其中一条件为空值如何设置忽略该条件而用其它条件组合查询??的主要内容,如果未能解决你的问题,请参考以下文章

SQL问题求助,查询结果如何清除NULL的空值

sql 子查询返回的值不止一个怎么解决?

当条件全部为空时,查询全部,当其中一个或两个条件为空时,为空的条件不查询,sql怎么写

SQL Server中如果查询条件为空,则查询全部,如何实现?

如何将不符合WHERE条件的联接表中的数据包含为空值(SQL)

MybatisPlusMP的分页查询多条件查询以及查询过程中解决null的空值判定