MySQL案例语句是否具有优先级?

MySQL案例语句是否具有优先级?,mysql,sql,Mysql,Sql,我正在处理一个存在一些空值的查询,在我的CASE语句中,没有处理空值的测试。我试着以不同的方式安排测试,但似乎没有什么不同 SELECT Title, library.LibraryID, Registered FROM libraries LEFT JOIN (SELECT LibraryID,UserID, (CASE >>> WHEN UserID IS NULL THEN "False" <<<

我正在处理一个存在一些空值的查询,在我的CASE语句中,没有处理空值的测试。我试着以不同的方式安排测试,但似乎没有什么不同

SELECT Title, library.LibraryID, Registered
FROM libraries
LEFT JOIN 
(SELECT LibraryID,UserID,
        (CASE  
>>>                WHEN UserID IS NULL THEN "False"     <<<<<<<< PROBLEM
               WHEN UserID=1 THEN "YES! Registered" 
                   ELSE "Not Registered" 
     END) AS Registered
FROM librariesandmembers WHERE UserID=1) AS myAlias 
ON libraries.LibraryID = myAlias.LibraryID');
选择标题,library.LibraryID,已注册
从图书馆
左连接
(选择库ID、用户ID、,
(案例

>>>当UserID为NULL时,则为“False”我几乎可以肯定这与您的join有关,而不是与您的case语句有关。也就是说,您使用处理NULL的开关构建子查询结果集,然后将其添加到库中,在不存在匹配项的情况下有效地创建完全为NULL的记录。因此,您对注册列所做的努力是徒劳的。请尝试重新构造查询像这样:

SELECT 
  Title, 
  libraries.LibraryID, 
  (
    CASE
      WHEN librariesandmembers.UserID IS NOT NULL THEN "YES! Registered"
      ELSE "Not Registered"
    END
  ) as Registered
FROM 
  libraries LEFT JOIN librariesandmembers
    ON libraries.LibraryID = librariesandmembers.LibraryID
    AND librariesandmembers.UserID = 1      
此外,您正在两次处理UserID=1标准。您的子查询有效地删除了所有其他UserID,因此您不需要ELSE子句(当UserID既不是1也不是NULL时处理)。我认为您可以将我建议的WHERE子句作为第二个联接条件,但我认为这将得到相同的结果。也许有人可以支持/反对我的方法?

这是您的疑问:

SELECT Title, l.LibraryID, Registered
FROM libraries lLEFT JOIN 
      (SELECT LibraryID, UserID,
              (CASE WHEN UserID IS NULL THEN "False"     <<<<<<<< PROBLEM
                    WHEN UserID=1 THEN "YES! Registered" 
                   ELSE "Not Registered" 
               END) AS Registered
       FROM librariesandmembers
       WHERE UserID = 1
      ) AS myAlias 
      ON l.LibraryID = myAlias.LibraryID;
试试这个

SELECT 
  Title, 
  libraries.LibraryID, 
  (
    CASE
      WHEN librariesandmembers.UserID IS Null OR librariesandmembers.UserID ='' THEN 'False'
      When librariesandmembers.UserID = 1 Then 'YES! Registered'
      ELSE "Not Registered"
    END
  ) as Registered
FROM 
  libraries LEFT JOIN librariesandmembers
    ON libraries.LibraryID = librariesandmembers.LibraryID
WHERE 
  librariesandmembers.UserID = 1
怎么样

SELECT a.Title, a.LibraryID, IFNULL(myAlias.Registered,'Not Registered') Registered
FROM libraries a
     LEFT JOIN 
        (SELECT b.LibraryID, ('YES! Registered') Registered
         FROM librariesandmembers b
         WHERE b.UserID=1) AS myAlias  ON libraries.LibraryID = myAlias.LibraryID
还是这个

SELECT a.Title, 
       a.LibraryID, 
       IF((SELECT COUNT(*) 
           FROM librariesandmembers b
           WHERE b.LibraryID=a.LibraryID AND b.UserID=1)=0,'Not Registered','Yes! Registered') Registered
FROM libraries a

在您的子查询中,只返回了两个可能的值。当用户在成员中不存在时,返回UserID或NULL。这就是CASE语句不起作用的原因。

当UserID为NULL时尝试此CASE,然后返回“False”?@LeDuyKhanh
NULL
不等于
NULL
。您自己尝试过内部查询吗?UserId在派生表中永远不会为NULL,因为您有一个where子句,该子句表示它必须等于1。让我试着这样解释目标:我想要一个包含所有内容的列表(例如5)库,其旁边的结果为用户“是!已注册”或“未注册”。librariesandmembers表中可能有也可能没有相应的条目。因此存在空问题。好的。我认为我的建议就足够了。但是,我们可能可以简化它。是否只有一个librariesandmembers记录来表示注册?我稍微更改了开关,所以现在只提到了一个目标用户ID。可以将幻数替换为变量或存储过程参数。当目标用户ID存在到该库的注册且“未注册”时,此查询应显示所有库记录并报告“是!已注册”当没有匹配时。这当然是一种更简洁的方法…但它只返回两个正注册。空/未注册不会出现在结果中。啊!我想这就是为什么我认为WHERE条件需要是一个连接条件。解决了。这个答案让我思考,我这样处理它…我的逻辑分三步:1)内部级别必须生成一个只包含id为1的注册成员的结果。假设该结果只匹配表中500个有效行中的3行。因此,内部查询只有3行。2)现在库上有一个左连接,我需要所有库,比如47个库。当用户1不是成员时,联接将生成匹配的null。3) 使用外部级别的case语句将空值转换为“False”或其他内容。希望这对其他人有所帮助,并感谢大家的指点。
SELECT a.Title, a.LibraryID, IFNULL(myAlias.Registered,'Not Registered') Registered
FROM libraries a
     LEFT JOIN 
        (SELECT b.LibraryID, ('YES! Registered') Registered
         FROM librariesandmembers b
         WHERE b.UserID=1) AS myAlias  ON libraries.LibraryID = myAlias.LibraryID
SELECT a.Title, 
       a.LibraryID, 
       IF((SELECT COUNT(*) 
           FROM librariesandmembers b
           WHERE b.LibraryID=a.LibraryID AND b.UserID=1)=0,'Not Registered','Yes! Registered') Registered
FROM libraries a