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 Server和MySQL测试并验证了这一点.也适用于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)
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
条款:
小智 6
为了使它更简单,这应该工作正常.如果根据idnumber的数据类型将此值分配给变量,则可以评估值是null还是实际的idnumber返回值.
SELECT ISNULL(
(
SELECT idnumber
FROM dbo.database
WHERE number = '9823474'
), NULL)
Run Code Online (Sandbox Code Playgroud)