如何在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列表中是否存在空值?
答
该查询将返回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
答
我找到了解决办法:
记住的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);
你传递数组或变量是什么类型的参数?您可以传递值没有空值或删除那些为空的变量,然后手动使用或名称IS NULL –