在SELECT语句中使用MYSQL CASE来检查NULL

46

在 MySQL 查询中,如果我传递:

  case guides.Gud_Publish_Date 
     when null then "Unscheduled" 
     else "Forth Coming Titles" 
  end

那么即使 Gud_Publish_Date 有值,它仍然认为所有内容都是 null。完整的 SQL 语句如下:

SELECT guides.Gud_Id
    , guides.Gud_Image
    , guides.Gud_SubEditor
    , guides.Gud_Reprint_Status
    , guides.Gud_Publish_Date
    , guides.Gud_Img_Chk
    , guides.Gud_Published
    , guides.Gud_View
    , (
        CASE guides.Gud_Publish_Date
            WHEN NULL
                THEN "Unscheduled"
            ELSE "Forth Coming Titles"
            END
        ) AS Schedules
FROM guides

3
琐碎,但我相信forthcoming是一个词。 - marvin
4个回答

89

尝试使用IF

SELECT guides.Gud_Id
    , guides.Gud_Image
    , guides.Gud_SubEditor
    , guides.Gud_Reprint_Status
    , guides.Gud_Publish_Date
    , guides.Gud_Img_Chk
    , guides.Gud_Published
    , guides.Gud_View
    , IF(guides.Gud_Publish_Date IS NULL,'Unscheduled','Forth Coming Titles') 
             AS Schedules
FROM guides

或者如果你真的需要 CASE

SELECT guides.Gud_Id
    , guides.Gud_Image
    , guides.Gud_SubEditor
    , guides.Gud_Reprint_Status
    , guides.Gud_Publish_Date
    , guides.Gud_Img_Chk
    , guides.Gud_Published
    , guides.Gud_View
    , (
        CASE 
            WHEN guides.Gud_Publish_Date IS NULL
            THEN 'Unscheduled'
            ELSE 'Forth Coming Titles'
        END
      ) AS Schedules
FROM guides

显示错误 /* SQL错误(1064):您的SQL语法中有错误;请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法使用方式,在第3行附近'guides.Gud_Publish_Date IS NULL,“未安排”,“即将推出的标题”)作为计划' */但是Case语句是有效的。感谢您的帮助。 - user1023242
你真的在使用 mysql 吗? :D 因为我提供的代码都是可行的。 - John Woo

15

我发现这篇 -几个月前的- 帖子。按照 Rajan 的意图使用 COALESCE 选项,你可以这样做:

我发现这篇 -几个月前的- 帖子。按照 Rajan 的意图使用 COALESCE 选项,你可以这样做:

SELECT guides.Gud_Id
    , guides.Gud_Image
    , guides.Gud_SubEditor
    , guides.Gud_Reprint_Status
    , guides.Gud_Publish_Date
    , guides.Gud_Img_Chk
    , guides.Gud_Published
    , guides.Gud_View
    , CASE COALESCE(guides.Gud_Publish_Date, 0)
          WHEN 0 THEN 'Unscheduled'
                 ELSE 'Forth Coming Titles'
          END  AS Schedules
FROM guides

上面的代码假设 guides.Gud_Publish_Date 不会取值为 0,我能做到这一点是因为它是一个日期。如果不是这种情况,您可以将 0 更改为另一个它不能取的值;可以选择您喜欢的浮点数,如 3.1415 或空标识符 'null'


1
这会向您的代码添加一个隐含的假设,即某些列永远不会取值为0(或3.1415或'null'或其他任何值)。避免隐含的假设……它们很容易被遗忘,因此很容易被违反。 - Elias Strehle
谢谢!我需要一个适用于MySQL和SQLite的解决方案,因为SQLite中不存在IF,而这个解决方案正好符合要求。 - James Eby

7
SELECT guides.Gud_Id
    , guides.Gud_Image
    , guides.Gud_SubEditor
    , guides.Gud_Reprint_Status
    , guides.Gud_Publish_Date
    , guides.Gud_Img_Chk
    , guides.Gud_Published
    , guides.Gud_View
    , (
        CASE WHEN guides.Gud_Publish_Date IS NULL
            THEN "Unscheduled"
            ELSE "Forth Coming Titles"
            END
        ) AS Schedules
FROM guides

-2

试试这个

SELECT guides.Gud_Id
    , guides.Gud_Image
    , guides.Gud_SubEditor
    , guides.Gud_Reprint_Status
    , guides.Gud_Publish_Date
    , guides.Gud_Img_Chk
    , guides.Gud_Published
    , guides.Gud_View
    , coalesce((
        CASE guides.Gud_Publish_Date
            WHEN NULL
                THEN 'Unscheduled'
            ELSE 'Forth Coming Titles'
            END
        ), 'Unscheduled') AS Schedules
FROM guides

1
这样行不通。当NULL时,CASE表达式会漏掉该条目并返回“即将推出的标题”; 由于它不是NULL,因此COALESCE返回相同的结果。 - Diego-MX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接