2014-06-17 20 views
0

有一些(困難)MySQL查詢MySQL是NULL不工作

SELECT 
    *, 
    (
     SELECT 
      MIN(tbl.id) 
     FROM 
      stat tbl 
     WHERE 
      tbl.id > stat.id 
      and tbl.user_id=stat.user_id 
    ) next_session_id, 
    (
     Select 
      (case 
       when next_session_id IS NULL then '9999-12-31 23:59:59' else sub.date 
      end) 
     from 
      stat sub 
     where 
      sub.id=next_session_id 
    ) next_date 
FROM 
    stat  
WHERE  
    user_id=15973 
    and date >'2014-06-01' 

問題在下面,最後一行是next_session_idNULL(在MySQL Workbench中查看),它必須返回日期時間'9999-12-31 23:59:59',但返回NULL。檢查IS NULL不工作,我認爲或不正確。爲什麼會發生? 結果的UPDATE 實施例設置 enter image description here

+1

你能提供樣本表數據和你通過這個查詢得到的輸出嗎? –

+1

As @Griddor說:如果'next_session_id IS NULL',那麼'SELECT'中用於計算next_date的'WHERE'子句將不爲真。您可以將其重寫爲'WHERE sub.id = next_session_id OR next_session_id IS NULL'。 – VMai

+0

@VMai thx解釋。我在查詢中做了一些修改+你的解釋和一切正常。添加您的評論,如答案,我感激地選擇 – disable1992

回答

0

您應該添加OR next_session_id IS NULL到您的子查詢

SELECT 
    (CASE 
     WHEN next_session_id IS NULL THEN '9999-12-31 23:59:59' ELSE sub.date 
    END) 
FROM 
    stat sub 
WHERE 
    sub.id=next_session_id OR next_session_id IS NULL 

WHERE條款,因爲沒有了where條件不會是真的,如果next_session爲null。

1

在數據庫NULL和''(空字符串)是不同的。因此,請確保您的表格中有NULL值,而不是''(空字符串)。

入住此查詢與你的表 SELECT * FROM TABLE WHERE next_session_id=''

+0

我知道這一刻。我說在工作臺檢查值!表沒有這個列。它使用幫助子查詢創建 – disable1992

1

嘗試修改此部分

Select 
    (case 
     when next_session_id IS NULL then '9999-12-31 23:59:59' else sub.date 
    end) 
from 
    stat sub 
where 
    sub.id=next_session_id 

case 
     when next_session_id IS NULL then '9999-12-31 23:59:59' else (
      Select sub.date 
      from 
      stat sub 
      where 
      sub.id=next_session_id) 
    end 

因爲在MySQL中,NULL = NULL不計算爲true。

+0

NULL IS NULL返回1,但NULL = NULL返回NULL。 IS NULL是在那個時刻創建的 – disable1992

+0

而你的變體創建相同的結果。 – disable1992

+0

@ disable1992爲什麼?當next_session_id爲NULL時它不會產生文字嗎? – cshu

0

我覺得IS NULL不工作,因爲某些原因,所以你可以使用= '', 例如x is null您可以使用x = ''代替。