如果没有找到记录,返回一个值。

56

我有一个简单的语句可以工作:

SELECT idnumber FROM dbo.database WHERE number = '9823474'

如果表中不存在该数字,则失败。我想在这个语句中添加一些内容,以便说:
如果没有找到记录,则返回 NULL 而不是无行。

有什么建议吗?


在哪一行给它赋值?没有任何行可以给它赋值。 - Lightness Races in Orbit
它失败了。"它失败了"是什么意思?它只是返回了空行。在我看来,这并不算是"失败"。 - undefined
7个回答

88

将查询封装在子查询中,以将“无行”转换为null值。

我已使用PostgreSQL, SQLite, SQL ServerMySQL进行了测试和验证。

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评论的那样):

SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id FROM SYSIBM.SYSDUMMY1;

1
在Firebird中运行良好。感谢您的研究。 - Valentin Despa
1
@8.8.8.8:因为子查询中的“无行”被转换为SELECT列表中的NULL值。这是逻辑上的必要性。 - Erwin Brandstetter
2
我很惊讶居然没有一个函数可以做到这一点。但是这绝对有效。 - chrismarx
1
如果你的查询没有返回任何行(完全没有),那么函数就没有捕获的地方。所以我们需要一个外部的 SELECT,甚至不需要一个函数。 - Erwin Brandstetter
1
在DB2中也适用,只需将“DUAL”替换为“SYSIBM.SYSDUMMY1”。 - Sean Branchaw
显示剩余3条评论

9
为了更简单易懂,可以这样处理。如果你将此分配给一个变量,基于你的idnumber数据类型,那么你就能够评估该值是null还是实际的idnumber返回。
SELECT ISNULL(
      (
         SELECT idnumber 
         FROM dbo.database 
         WHERE number = '9823474'
      ), NULL)

PostgreSQL 没有 ISNULL 函数。 - ChatGPT

4
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

1

我用这个来操作 MySql

SELECT IFNULL(ColumnA,"1") AS ColumnA , COUNT(1) AS Total FROM table 
WHERE ID = 1 LIMIT 0, 1;

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'

0

这里是一个独立的Oracle概念验证,它返回一个真实值而不是NULL

在Oracle中,“dual”表总是有一个名为“dummy”的列,其中包含“X”。因此,以下语句永远不会返回行。

select * from dual where dummy='123';

因此,通过nvl函数,该语句将始终返回“NO RECORD FOUND”

select nvl((select * from dual where dummy='123'),'NO RECORD FOUND') value from dual;

...但是,如果您真的想要NULL,可以执行以下操作(如上所述)

select (select * from dual where dummy='123') value from dual;

当然,将上述选择语句与您自己的语句交换


0
您可以使用COALESCE
COALESCE((SELECT idnumber FROM dbo.database WHERE number = '9823474'),0)

0替换为任何您想要返回的值,如果选择查询不返回任何行。


COALESCE捕获null值,但无法捕获“无行”。 - Erwin Brandstetter
@ErwinBrandstetter 当处理单列时,将COALESCE移到SELECT之外可以解决问题。 - Aparna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接