警告:我不是一個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