MySQL案例语句是否具有优先级?
我正在处理一个存在一些空值的查询,在我的CASE语句中,没有处理空值的测试。我试着以不同的方式安排测试,但似乎没有什么不同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" <<<
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”?@LeDuyKhanhNULL
不等于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