【发布时间】:2011-12-27 06:44:22
【问题描述】:
我有一个有效的简单语句:
SELECT idnumber FROM dbo.database WHERE number = '9823474'
如果该数字在表中的任何位置都不存在,则失败。我想在此声明中添加一些内容:
如果没有找到记录,则返回 NULL 而不是 NO ROW。
有什么建议吗?
【问题讨论】:
-
在哪一行给它那个值?没有行可以给它一个值。
我有一个有效的简单语句:
SELECT idnumber FROM dbo.database WHERE number = '9823474'
如果该数字在表中的任何位置都不存在,则失败。我想在此声明中添加一些内容:
如果没有找到记录,则返回 NULL 而不是 NO ROW。
有什么建议吗?
【问题讨论】:
将查询封装在子查询中,将“无行”转换为 NULL 值。
我使用PostgreSQL、SQL Server 和MySQL 对此进行了测试和验证。也适用于SQLite。
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;
这适用于DB2(如Sean commented):
SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id FROM SYSIBM.SYSDUMMY1;
UNION ALL
SELECT id FROM tbl WHERE id = 9823474
UNION ALL
SELECT NULL -- FROM DUAL -- for Oracle
FETCH FIRST 1 ROW ONLY;
标准 SQL,但我只使用 Postgres 进行了测试,其评估结果如下:
如果在第一个 SELECT 中找到一行,则返回该行。由于LIMIT 1 (FETCH FIRST 1 ROW ONLY),一旦找到第一行,Postgres 就会停止寻找更多行。
第二个SELECT 仅在第一个不返回任何内容时才会执行。 NULL值的数据类型由tbl.id的数据类型自动确定。
关于LIMIT 子句:
【讨论】:
SELECT 列表中的NULL 值。这是逻辑上的必然。
SELECT - 然后我们甚至不需要一个函数。
DUAL 替换为 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'
【讨论】: