2012-05-21 28 views
0

我最近發現,如果數值在null之內,某個查詢將無法處理我的一些記錄。顯然在SQL中,null不能與任何東西進行比較 - 即使是null如何在SQL條件子句中處理null?

UPDATE company SET views = IF(views, views + 1, 1), 
trendingViews = IF(viewed != '2012-05-21 00:00:00', 1, trendingViews + 1), 
viewed = IF(viewed != '2012-05-21 00:00:00', '2012-05-21 00:00:00', viewed) 
WHERE id = '3024' 

我怎樣才能改變這種查詢到有條件檢查null提供的數值和?

回答

2

使用COALESCE:

UPDATE company 
SET views = COALESCE(views, 0) + 1, 
    trendingViews = IF(viewed != '2012-05-21 00:00:00', 1, trendingViews + 1), 
    viewed = IF(viewed != '2012-05-21 00:00:00', '2012-05-21 00:00:00', viewed) 
WHERE id = '3024' 
1

檢查空值的正確方法是MyField IS NULL。正如您正確指出的那樣,直接比較null不起作用。

1

如果要排除結果,其中一個column不爲空,那麼你需要你的where子句中使用is not null

select ... 
where ... 
and column is not null 
3

二者必選其一Coalesce(value1, ... valueN)isnull(value1, value2)到爲空字段定義一個可選的非空值。

Coalesce將返回參數列表中的第一個非空值。如果第一個是空

2

除了給出其他答案,你也可以使用NULL -safe比較操作<=>Isnull將返回第二個參數值。

1

警告:我不是一個mysql人員,而是一個TSQL人員。 首先,對您的一個條件更新語句的一般邏輯發表評論:當您首次檢查「查看」 特定值時,如果「查看」不是該值,請將其設置爲該值,您正在工作比必要的更難。

我的意思是如果你知道你想讓所有記錄的ID爲3024的'已查看'列具有相同的時間戳,那麼首先檢查列中的任何值,然後只更新那些列不匹配,不需要 等額外的工作。如果您的意圖是所有'查看'(其中Id ='3024')應設置爲'2012-05-21 00:00:00', 那麼,只需將它們設置爲該值即可。沒有必要考慮他們原來的價值是什麼..你不在乎。

所以不是:

viewed = IF(viewed != '2012-05-21 00:00:00', '2012-05-21 00:00:00', viewed) 

你只需要:

viewed = '2012-05-21 00:00:00' 

其次,你可以在你使用if語句「或」和/或「聚結」,使空值會不容忽視。 通過使用OR與IS NULL和/或與非空默認值合併,您可以強制更新任何空值,無論如何。 (在您的具體示例中,使用默認值爲0的合併,將會影響 'trendingViews'列中的先前空值爲1,因爲您正在遞增1,並且您將使用0作爲您的空實例的默認值。)

例子:

trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1), 

update語句中的第一行......那臺「若干意見」讓我困惑, 因爲我不知道你的意圖是檢查存在的部分名爲'views'的列/字段 ,或者如果您試圖檢查'views'列中的值是否爲非null。 如果你的目的是要檢查它是否不爲空,然後在這種情況下,加1它, 如果它爲空,然後將其設置爲1,那麼可以這樣做:

views = IF(views IS NULL != 1, views + 1, 1), 

所以這裏是整個聲明,我將測試(在MYSQL):

UPDATE company SET 
    views = IF(views IS NULL = 0, views + 1, 1), 
    trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1), 
    viewed = '2012-05-21 00:00:00' 
WHERE id = '3024'; 

請記住,我不使用MYSQL ....沒有測試這些MYSQL變化。 如果我在TSQL中這樣做,以下聲明將起作用:

UPDATE company SET 
     [views] = (CASE WHEN [views] IS NOT NULL THEN [views] + 1 ELSE 1 END), 
     trendingViews = CASE WHEN viewed IS NULL OR viewed != '2012-05-21 00:00:00' THEN 1 ELSE COALESCE(trendingViews, 0) + 1 END, 
     viewed = '2012-05-21 00:00:00' 
    WHERE id = '3024'; 
    go