如果未找到任何行,则返回默认值

Fib*_*con 18 mysql select default

我有以下select语句,以获取流的下一个计划项.如果没有匹配的行,我希望它返回默认值.这是我正在使用的线:

SELECT `file` FROM `show`, `schedule` 
   WHERE `channel` = 1 AND `start_time` <= UNIX_TIMESTAMP() 
   AND `start_time` > UNIX_TIMESTAMP()-1800 AND `show`.`id` = `schedule`.`file` 
   ORDER BY `start_time` DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)

这应该抓住最近计划的项目,但不是如果它超过查询前30分钟.但是,如果用户没有安排任何内容,我想要一个默认值,以便在流上实际播放某些内容.我尝试过以下方法:

SELECT COALESCE(`file`, 'default.webm') FROM `show`, `schedule`...
Run Code Online (Sandbox Code Playgroud)

和:

SELECT IFNULL(`file`, 'default.webm') FROM `show`, `schedule`
Run Code Online (Sandbox Code Playgroud)

但是,如果找不到行,它总是返回空结果.如何返回默认值?

pet*_*erm 22

一种方法

SELECT IFNULL(MIN(`file`), 'default.webm') `file` 
  FROM `show`, `schedule` 
 WHERE `channel` = 1 AND `start_time` <= UNIX_TIMESTAMP() 
   AND `start_time` > UNIX_TIMESTAMP()-1800 AND `show`.`id` = `schedule`.`file` 
 ORDER BY `start_time` DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)

由于您只返回一行,因此您可以使用聚合函数,在这种情况下MIN(),确保NULL如果没有选择记录,您将获得.然后IFNULL()COALESCE()将完成它的工作.


mic*_*usa 8

对于只需要一行结果的情况,只需UNION在第二SELECT个子句中使用硬编码值,该子句与原始SELECT具有相同的列数.

对于OP:

(SELECT `file` FROM `show`, `schedule` 
   WHERE `channel` = 1 AND `start_time` <= UNIX_TIMESTAMP() 
   AND `start_time` > UNIX_TIMESTAMP()-1800 AND `show`.`id` = `schedule`.`file` 
   ORDER BY `start_time` DESC LIMIT 1) UNION (SELECT 'default.webm') LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

除非出现语法错误,否则结果集将提供一行,并调用一列file.


作为一个更一般的例子:

(SELECT Col1,Col2,Col3 FROM ExampleTable WHERE ID='1234')
 UNION (SELECT 'Def Val','none','') LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

在任一情况下:

  • 如果在第一个SELECT中找不到行,则结果集将使用第二个SELECT中的值填充.

  • 如果在第一个SELECT中找到一行,则在结果集中提供第一个SELECT值,并省略第二个SELECT值.

*如果要从第一个SELECT使用相同的列(按相同顺序),则不必为第二个SELECT值分配列名/别名.

*UNION不要求两个联合查询中的列名相同,实际上,如果它有助于您的情况,您可以为第二个SELECT查询分配不同的列名.(您的结果集处理代码需要适应这些列命名差异.)

(SELECT Col1,Col2,Col3 FROM ExampleTable WHERE ID='1234')
 UNION (SELECT 'Def Val' AS `Fallback1`,'none' AS `Fallback2`,'' AS `Fallback3`) LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

我的意见是,这很容易阅读,看起来不像是一个征税的问题.

  • 这对我来说非常有效。我需要使用谓词进行聚合(`MAX`),如果没有与谓词匹配的行,则不会返回任何行。现在我取回了默认值。 (2认同)