如何为不返回任何行的查询设置默认行?

Joh*_*man 29 sql sql-server

如果表中不存在行,我需要知道如何返回默认行.最好的方法是什么?我只从这个特定的表返回一个列来获取它的值.

编辑:这将是SQL Server.

WW.*_*WW. 38

Oracle的一种方法:

SELECT val
FROM myTable
UNION ALL
SELECT 'DEFAULT'
FROM dual
WHERE NOT EXISTS (SELECT * FROM myTable)
Run Code Online (Sandbox Code Playgroud)

或者在Oracle中:

SELECT NVL(MIN(val), 'DEFAULT')
FROM myTable
Run Code Online (Sandbox Code Playgroud)

或者在SqlServer中:

SELECT ISNULL(MIN(val), 'DEFAULT')
FROM myTable
Run Code Online (Sandbox Code Playgroud)

这些使用在没有行时MIN()返回的事实NULL.


Dav*_*sta 13

如果您的基本查询只返回一行,那么您可以使用此技巧:

select NVL( MIN(rate), 0 ) AS rate 
from d_payment_index
where fy = 2007
  and payment_year = 2008
  and program_id = 18
Run Code Online (Sandbox Code Playgroud)

(Oracle代码,不确定NVL是否是SQL Server的正确功能.)

  • 问题是如何在没有返回行时返回默认值. (5认同)
  • 使用MIN函数意味着,如果没有符合条件的行,将返回具有NULL值的单行.(至少,在Oracle中也是如此 - 也许SQL Server不同.) (2认同)

duc*_*rth 10

这将消除选择查询从运行两次并且更好的性能:

Declare @rate int

select 
    @rate = rate 
from 
    d_payment_index
where 
    fy = 2007
    and payment_year = 2008
    and program_id = 18

IF @@rowcount = 0
    Set @rate = 0

Select @rate 'rate'
Run Code Online (Sandbox Code Playgroud)


Eik*_*ike 7

此代码片段使用通用表表达式来减少冗余代码并提高可读性。这是约翰·鲍曼答案的变体。

该语法适用于 SQL Server。

WITH products AS (
            SELECT prod_name,
                   price
              FROM Products_Table
             WHERE prod_name LIKE '%foo%'
     ),
     defaults AS (
            SELECT '-' AS prod_name,
                   0   AS price
     )

SELECT * FROM products
UNION ALL
SELECT * FROM defaults
 WHERE NOT EXISTS ( SELECT * FROM products );
Run Code Online (Sandbox Code Playgroud)


bea*_*ach 6

这个怎么样:

SELECT DEF.Rate, ACTUAL.Rate, COALESCE(ACTUAL.Rate, DEF.Rate) AS UseThisRate
FROM 
  (SELECT 0) DEF (Rate) -- This is your default rate
LEFT JOIN (
  select rate 
  from d_payment_index
  --WHERE 1=2   -- Uncomment this line to simulate a missing value

  --...HERE IF YOUR ACTUAL WHERE CLAUSE. Removed for testing purposes...
  --where fy = 2007
  -- and payment_year = 2008
  --  and program_id = 18
) ACTUAL (Rate) ON 1=1
Run Code Online (Sandbox Code Playgroud)

结果

有效费率存在

Rate        Rate        UseThisRate
----------- ----------- -----------
0           1           1
Run Code Online (Sandbox Code Playgroud)

使用的默认费率

Rate        Rate        UseThisRate
----------- ----------- -----------
0           NULL        0
Run Code Online (Sandbox Code Playgroud)

测试DDL

CREATE TABLE d_payment_index (rate int NOT NULL)
INSERT INTO d_payment_index VALUES (1)
Run Code Online (Sandbox Code Playgroud)