(重要提示:我不知道值列表,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列表中是否存在空值?
答案 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 );