如果未找到记录,则返回一个值

use*_*304 36 sql null select record

我有这个简单的声明:

SELECT idnumber FROM dbo.database WHERE number = '9823474'
Run Code Online (Sandbox Code Playgroud)

如果表中的任何位置都不存在该数字,则会失败.我想在这个声明中添加一些内容:
如果没有记录,则返回NULL,不要行.

有什么建议?

Erw*_*ter 58

将查询封装在子查询中以将"无行"转换为NULL值.

我使用PostgreSQL,SQL ServerMySQL测试并验证了这一点.也适用于SQLite.

SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id;
Run Code Online (Sandbox Code Playgroud)

Oracle中,您必须从虚拟1行表中进行选择,DUAL如下所示:

SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

出于兼容性原因,您可以在MySQL中执行相同的操作,但您不必这样做.
类似于Firebird:

SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id FROM RDB$DATABASE;
Run Code Online (Sandbox Code Playgroud)

这适用于DB2(如Sean评论):

SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id FROM SYSIBM.SYSDUMMY1;
Run Code Online (Sandbox Code Playgroud)

替代 UNION ALL

SELECT id FROM tbl WHERE id = 9823474
UNION  ALL
SELECT NULL -- FROM DUAL  -- for Oracle
FETCH FIRST 1 ROW ONLY;
Run Code Online (Sandbox Code Playgroud)

标准SQL,但我只用Postgres 对它进行了测试,其评估结果如下:
如果在第一行中找到一行SELECT,则返回它.Postgres一旦找到第一行就会停止寻找更多行,因为LIMIT 1(FETCH FIRST 1 ROW ONLY).如果第一个没有返回
,第二个SELECT甚至只执行.NULL值的数据类型由数据类型tbl.id自动确定.

关于LIMIT条款:

  • 在火鸟中运行良好。感谢您进行研究。 (2认同)
  • 我很惊讶没有一个函数可以做到这一点。但这绝对有效 (2认同)
  • 如果您用“SYSIBM.SYSDUMMY1”替换“DUAL”,这也适用于 DB2。 (2认同)

小智 6

为了使它更简单,这应该工作正常.如果根据idnumber的数据类型将此值分配给变量,则可以评估值是null还是实际的idnumber返回值.

SELECT ISNULL(
      (
         SELECT idnumber 
         FROM dbo.database 
         WHERE number = '9823474'
      ), NULL)
Run Code Online (Sandbox Code Playgroud)