即使RIGHT值不存在,也返回LEFT值

时间:2019-04-26 00:58:03

标签: sql sqlite

我正在尝试最小化在我的应用程序中进行的查询数量。在这种情况下,我需要通过聊天服务器ID来查找聊天服务器的属性,并从另一个表中找到具有“开始时间”值但空“结束时间”值的关联服务器ID的任何“实时流”(表示直播仍在进行中)。如果没有正在进行的实时流,则“结束时间”值都不会为空,但是我仍然需要该服务器的属性。

本质上:

查找服务器属性并找到实时流:

  • 如果没有实时流(结束时间不为空),请使用服务器属性进行操作
  • 否则,如果有直播(结束时间为空的条目),请告知用户
SELECT t1.properties
FROM t1 
LEFT OUTER JOIN t_streams 
ON t1.serverID = t2.serverID 
WHERE t1.serverID = '<id>';

...如果t2完全为空,则返回null的结束时间,这是好的,但是如果不是,则返回所有行,这是不好的。

SELECT t1.properties
FROM t1
LEFT OUTER JOIN t_streams
ON t1.serverID = t2.serverID
WHERE t1.serverID = '<id>'
AND t2.endtime IS NULL;

...如果没有实时流处于活动状态(没有行的结束时间为空),则不返回任何内容,但是无论如何至少需要返回t1.properties。

基本上,如果当前没有活动的直播,我试图使用“服务器属性”创建一个新的“直播”。

1 个答案:

答案 0 :(得分:1)

我认为您可能想要这样的东西:

SELECT t1.properties
FROM t1 LEFT OUTER JOIN
     t_streams t2
     ON t1.serverID = t2.serverID
WHERE t1.serverID = '<id>'
ORDER BY (CASE WHEN t2.endtime IS NULL THEN 1 ELSE 2 END),
         t2.endtime DESC
LIMIT 1;

这将返回一个匹配的行,其中endtime的首选项为NULL