如何在mysql中用NULL选择所有行'IN'的值列表?

时间:2016-12-04 05:05:11

标签: mysql sql database

(重要提示:我不知道值列表,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(??????)

用??????我的意思是我需要选择NULLS?

你能帮帮忙吗?谢谢。

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

2 个答案:

答案 0 :(得分:2)

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

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

对于参数send 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

答案 1 :(得分:0)

我找到了解决方案:

请记住,在MySQL的CONCAT文档中说: 如果任何参数为NULL, CONCAT()将返回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)

如果名称为IS NULL:

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

如果姓名是' Paul':

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 );