【问题标题】:Return a value if no record is found如果没有找到记录,则返回一个值
【发布时间】:2011-12-27 06:44:22
【问题描述】:

我有一个有效的简单语句:

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

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

有什么建议吗?

【问题讨论】:

  • 在哪一行给它那个值?没有行可以给它一个值。

标签: sql select null record


【解决方案1】:

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

我使用PostgreSQLSQL ServerMySQL 对此进行了测试和验证。也适用于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 子句:

【讨论】:

  • 在 Firebird 中运行良好。感谢您进行研究。
  • @8.8.8.8:因为子查询中的“无行”被转换为SELECT 列表中的NULL 值。这是逻辑上的必然。
  • 我很惊讶没有一个函数可以做到这一点。但这绝对有效
  • @chrismarx:如果您的查询没有返回任何行(什么都没有),那么函数就没有地方可以捕捉到它。所以我们需要一个外部的SELECT - 然后我们甚至不需要一个函数。
  • 这也适用于 DB2,前提是您将 DUAL 替换为 SYSIBM.SYSDUMMY1
【解决方案2】:

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

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

【讨论】:

  • PostgreSQL 没有 ISNULL 函数。
【解决方案3】:
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

【讨论】:

    【解决方案4】:

    我将它用于 MySql

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

    【讨论】:

      【解决方案5】:

      对我来说最简单的方法是使用古老的 IF THEN ELSE 技巧!适用于所有 SQL 风格。

      IF EXISTS (SELECT * FROM dbItem WHERE price >= 10)
      BEGIN
          SELECT * FROM dbItem WHERE price >= 10
      END
      ELSE
        SELECT 'No record'
      

      【讨论】:

        猜你喜欢
        • 2013-07-24
        • 2018-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 2015-02-14
        • 1970-01-01
        相关资源
        最近更新 更多