我有一个简单的声明:
SELECT idnumber FROM dbo.database WHERE number = '9823474'
如果该数字在表中的任何地方都不存在,则失败。我想在此声明中添加一些内容:
如果没有找到记录,则返回 NULL 而不是 NO ROW。
有什么建议吗?
将查询封装在子查询中,将“无行”转换为
null
值。
我用 PostgreSQL、SQLite、SQL Server 和 MySQL 进行了测试和验证。
SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id;
在Oracle中,您必须从虚拟1行表中进行选择
DUAL
:
SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id FROM DUAL;
出于兼容性原因,您可以在 MySQL 中执行相同的操作,但您不必这样做。
类似于Firebird:
SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id FROM RDB$DATABASE;
SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id FROM SYSIBM.SYSDUMMY1;
为了让它更简单,这应该可以正常工作。如果您根据您的 idnumber 的数据类型将其分配给一个变量,那么您将能够评估该值是 null 还是实际的 idnumber 返回。
SELECT ISNULL(
(
SELECT idnumber
FROM dbo.database
WHERE number = '9823474'
), NULL)
Select isnull(sum(Amount),0) as Amt from BeginningBalance where CustomerID = @CustomerID
Union all
Select isnull(sum(Amount),0) as Amt from SalesOrders where CustomerID = @CustomerID
Union all
Select isnull(sum(Amount),0) as Amt from SalesInvoices where CustomerID = @CustomerID
//Data Row Result if no data is present at Beginning Balance Table
// example
Amt
2000 // amount from sales orders
1000 // amount from sales invoices
// if the 1st select statement return no data use this
SELECT (select sum(Amount) from BeginningBalance
where CustomerID = @CustomerID) as Amt
Union all
Select sum(Amount) as Amt from SalesOrders where CustomerID = @CustomerID
Union all
Select sum(Amount) as Amt from SalesInvoices where CustomerID = @CustomerID
结果:
Amt
NULL // amount from BeginningBalance
2000 // amount from sales orders
1000 // amount from sales invoices
我将它用于 MySql
SELECT IFNULL(ColumnA,"1") AS ColumnA , COUNT(1) AS Total FROM table
WHERE ID = 1 LIMIT 0, 1;
对我来说最简单的方法是使用古老的
IF THEN ELSE
技巧!适用于所有 SQL 风格。
IF EXISTS (SELECT * FROM dbItem WHERE price >= 10)
BEGIN
SELECT * FROM dbItem WHERE price >= 10
END
ELSE
SELECT 'No record'
这里是 Oracle 中的独立概念验证,它返回一个真实值而不是 NULL
在 Oracle 中,“双”表总是有一个名为“虚拟”的列,其中包含“X”。因此,下面的语句永远不会返回一行。
select * from dual where dummy='123';
因此由于 nvl 函数,此语句将始终返回“未找到记录”
select nvl((select * from dual where dummy='123'),'NO RECORD FOUND') 双重价值;
...但是,如果你真的想要 NULL 你可以这样做(如上所述)
select (select * from dual where dummy='123') value from dual;
当然,把上面的select语句换成你自己的