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的正确功能.)
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)
此代码片段使用通用表表达式来减少冗余代码并提高可读性。这是约翰·鲍曼答案的变体。
该语法适用于 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)
这个怎么样:
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)