2016-12-04 41 views
0

(注意:我不知道值的列表中,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 –

回答

2

該查詢將返回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對於這個問題並不重要。 –

0

我找到了解決辦法:

記住的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

相關問題