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

问题描述 投票:0回答:6

我有一个简单的声明:

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

如果该数字在表中的任何地方都不存在,则失败。我想在此声明中添加一些内容:
如果没有找到记录,则返回 NULL 而不是 NO ROW。

有什么建议吗?

sql select null record
6个回答
84
投票

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

null
值。

我用 PostgreSQLSQLiteSQL 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;

9
投票

为了让它更简单,这应该可以正常工作。如果您根据您的 idnumber 的数据类型将其分配给一个变量,那么您将能够评估该值是 null 还是实际的 idnumber 返回。

SELECT ISNULL(
      (
         SELECT idnumber 
         FROM dbo.database 
         WHERE number = '9823474'
      ), NULL)

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 中,“双”表总是有一个名为“虚拟”的列,其中包含“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语句换成你自己的

© www.soinside.com 2019 - 2024. All rights reserved.