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

问题描述:

(注意:我不知道值的列表中,IN值是一个参数。)如何在mysql中选择所有行'IN'的值为NULL的列表?

我要选择使用表中的所有行,该值是varchar类型,但也许有空值,我如何查询包括空值在内的所有行?

例子:

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

这个查询将返回保罗或丹尼尔或雅科夫,但从来没有名为null,则返回的行。

一个解决方案可能使一个联盟:

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

随着??????我的意思是我需要在哪里选择NULLS?

你能帮忙吗?,谢谢。

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

+0

你传递数组或变量是什么类型的参数?您可以传递值没有空值或删除那些为空的变量,然后手动使用或名称IS NULL –

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

SELECT * 
FROM people 
WHERE name IN('Paul', 'Daniel', 'Yakov') 
OR name IS 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 
+0

我不知道值的列表,IN值是一个参数.. –

+0

您是否使用动态查询? – Esty

+0

yes在php中是动态的PDO,但是php和PDO对于这个问题并不重要。 –

我找到了解决办法:

记住的CONCAT在MySQL的文档中说: 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) 

如果name为null:

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

IF的名字是 '保罗':

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

你觉得呢?

我真正想要的是用在PHP中使用此查询PDO喜欢:

$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); 
+0

我不明白..它与我的回答有什么不同。 –

+0

我太困惑了。 – Esty

+0

如果你想显示所有的空名称和'param'名字,你可以像@Prdp那样做,或者我的第一个查询说。 – Esty