【问题标题】:How to select all the rows 'IN' a list of values with NULL in mysql?如何在mysql中选择所有行'IN'一个带有NULL的值列表?
【发布时间】:2016-12-07 04:50:41
【问题描述】:

(重要提示:我不知道值的列表,IN 值是一个参数..)

我想使用 IN 选择表中的所有行,值是 varchar 类型但可能有空值,我如何查询包括空值在内的所有行?

例子:

SELECT * FROM people WHERE name IN('Paul', 'Daniel', 'Yakov', null)

此查询将返回 Paul、Daniel 或 Yakov,但绝不会返回名称为 null 的行。

一个解决方案可能会建立一个联合:

SELECT * FROM people WHERE name IN('Paul', 'Daniel', 'Yakov', null)
UNION ALL
SELECT * FROM people WHERE name IN(??????)

用??????我的意思是我需要放什么来选择空值?

你能帮忙吗?,谢谢。

重要提示:如何检查 IN 列表中是否存在空值?

【问题讨论】:

  • 你传递的参数是什么类型的数组或变量?您可以传递不带 null 的值或删除那些为 null 的变量,然后手动使用 OR name IS NULL

标签: mysql sql database


【解决方案1】:

此查询将返回 Paul、Daniel 或 Yakov 或名称为 null 的行。 =IN null 将始终返回 null。所以你必须使用IS NULL

SELECT * 
FROM people 
WHERE name IN('Paul', 'Daniel', 'Yakov') 
OR name IS NULL

对于参数发送 null 不同。

DECLARE @params AS VARCHAR(20) = '''Paul', 'Daniel', 'Yakov'''
DECLARE @willNULLShow AS BIT = 1

DECLARE @Query AS VARCHAR(400)

SET @Query = 'SELECT * FROM people WHERE name IN '+ @params
IF @willNULLShow = 1
BEGIN
    SET @Query = @Query + ' OR name IS NULL'
END

【讨论】:

  • 你在使用动态查询吗??
  • yes 是动态的,在 php 中使用 PDO,但是 php 和 PDO 对于这个问题并不重要。
【解决方案2】:

我找到了解决办法:

请记住,在 MySQL 中 CONCAT 的文档中说: CONCAT() 如果任何参数为 NULL,则返回 NULL。

SELECT * FROM  people 
    WHERE (IF (CONCAT( 'Paul', 'Daniel', 'Yakov', null  ) IS NULL, 
         name IS NULL, name IN( 'Paul', 'Daniel', 'Yakov', null ) )) 
        OR name IN('Paul', 'Daniel', 'Yakov', null)

如果名称为空:

SELECT * FROM  people 
    WHERE (IF (CONCAT( null  ) IS NULL, 
         name IS NULL, name IN( null ) )) 
        OR name IN(null)

如果名字是“保罗”:

SELECT * FROM  people 
    WHERE (IF (CONCAT( 'Paul'  ) IS NULL, 
         name IS NULL, name IN( 'Paul' ) )) 
        OR name IN('Paul')

你怎么看?

我真正想要的是使用 PDO 在 PHP 中使用这个查询,例如:

$query = "SELECT * FROM  people 
        WHERE (IF (CONCAT( :name  ) IS NULL, 
             name IS NULL, name IN( :name ) )) 
            OR name IN(:name)";

$stmt->bindParam( "name", "Paul" );

//or

$stmt->bindParam( "name", null );

【讨论】:

  • 我不明白..它与我的答案有何不同。
  • 如果你想显示所有空名称和param 名称,你可以按照@Prdp 或我的第一个查询所说的那样做。
  • 我只能看到你在查询中做了很多不需要的事情
  • 我现在也是 :'( 因为,我正在考虑从 php 中查询表,将参数绑定到 ('a,b,c,d'),但现在我认为这些值将绑定为 'a,b,c,d' 而不是'a','b','c',d'... :'(
  • 但此查询仅适用于一个值:如果值为 'Paul' 有效或值为 NULL 有效.. 不适用于绑定的多个值
猜你喜欢
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多