回答
在Oracle:
SELECT val
FROM myTable
UNION ALL
SELECT 'DEFAULT'
FROM dual
WHERE NOT EXISTS (SELECT * FROM myTable)
或者:
SELECT NVL(MIN(val), 'DEFAULT')
FROM myTable
你想返回一整行嗎?默認行是否需要具有默認值或者它是否爲空行?您是否希望默認行具有與所討論的表相同的列結構?
根據您的要求,你可能會做這樣的事情:
1)運行查詢,並放在一個臨時表結果(或表變量) 2)檢查是否臨時表有結果 3)如果沒有,通過執行與此類似(SQL Server中的select語句)返回一個空行:
select '' as columnA, '' as columnB, '' as columnC from #tempTable
凡columnA,columnB和columnC是實際的列名。
我想通了,也應該對其他系統的工作了。這是WW的答案的變體。
select rate
from d_payment_index
where fy = 2007
and payment_year = 2008
and program_id = 18
union
select 0 as rate
from d_payment_index
where not exists(select rate
from d_payment_index
where fy = 2007
and payment_year = 2008
and program_id = 18)
該解決方案的唯一問題是您正在運行查找兩次。另一種方法是將結果存儲在一個變量中,如果第一個查詢的行數爲零,則只返回默認值。 – duckworth 2008-11-12 23:27:07
只有其他問題是我在代碼中運行這個,所以一個語句是最好的。但是,我同意你的看法。 – 2008-11-12 23:29:37
這將是運行兩次消除選擇查詢,並獲得更好的性能:使用左
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'
一個表掃描方法從默認加入到實際值:
CREATE TABLE [stackoverflow-285666] (k int, val varchar(255))
INSERT INTO [stackoverflow-285666]
VALUES (1, '1-1')
INSERT INTO [stackoverflow-285666]
VALUES (1, '1-2')
INSERT INTO [stackoverflow-285666]
VALUES (1, '1-3')
INSERT INTO [stackoverflow-285666]
VALUES (2, '2-1')
INSERT INTO [stackoverflow-285666]
VALUES (2, '2-2')
DECLARE @k AS int
SET @k = 0
WHILE @k < 3
BEGIN
SELECT @k AS k
,COALESCE(ActualValue, DefaultValue) AS [Value]
FROM (
SELECT 'DefaultValue' AS DefaultValue
) AS Defaults
LEFT JOIN (
SELECT val AS ActualValue
FROM [stackoverflow-285666]
WHERE k = @k
) AS [Values]
ON 1 = 1
SET @k = @k + 1
END
DROP TABLE [stackoverflow-285666]
給出輸出:
k Value
----------- ------------
0 DefaultValue
k Value
----------- ------------
1 1-1
1 1-2
1 1-3
k Value
----------- ------------
2 2-1
2 2-2
如果你的基本查詢預計只返回一行,那麼你可以使用這一招:如果NVL是SQL Server的正確功能
select NVL(MIN(rate), 0) AS rate
from d_payment_index
where fy = 2007
and payment_year = 2008
and program_id = 18
(甲骨文代碼,不知道。)
如何:
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
結果
有效利率時使用
Rate Rate UseThisRate
----------- ----------- -----------
0 1 1
違約率
Rate Rate UseThisRate
----------- ----------- -----------
0 NULL 0
測試DDL
CREATE TABLE d_payment_index (rate int NOT NULL)
INSERT INTO d_payment_index VALUES (1)
插入您的默認值到一個表變量,然後與你的實際表匹配更新此tableVar的單行。如果找到一行,tableVar將被更新;如果不是,則保留默認值。返回表變量。
---=== The table & its data
CREATE TABLE dbo.Rates (
PkId int,
name varchar(10),
rate decimal(10,2)
)
INSERT INTO dbo.Rates(PkId, name, rate) VALUES (1, 'Schedule 1', 0.1)
INSERT INTO dbo.Rates(PkId, name, rate) VALUES (2, 'Schedule 2', 0.2)
這裏的解決方案:
---=== The solution
CREATE PROCEDURE dbo.GetRate
@PkId int
AS
BEGIN
DECLARE @tempTable TABLE (
PkId int,
name varchar(10),
rate decimal(10,2)
)
--- [1] Insert default values into @tempTable. PkId=0 is dummy value
INSERT INTO @tempTable(PkId, name, rate) VALUES (0, 'DEFAULT', 0.00)
--- [2] Update the single row in @tempTable with the actual value.
--- This only happens if a match is found
UPDATE @tempTable
SET t.PkId=x.PkId, t.name=x.name, t.rate = x.rate
FROM @tempTable t INNER JOIN dbo.Rates x
ON t.PkId = 0
WHERE x.PkId = @PkId
SELECT * FROM @tempTable
END
測試代碼:
EXEC dbo.GetRate @PkId=1 --- returns values for PkId=1
EXEC dbo.GetRate @PkId=12314 --- returns default values
- 1. 如何爲不返回行的查詢設置默認值?
- 2. Sqlite選擇查詢 - 返回默認行?
- 3. 如何設置默認爲空查詢
- 4. 設置默認值,如果MySQL的選擇查詢返回的空行
- 5. 爲SQL查詢設置默認模式
- 6. 返回默認窗體行爲
- 7. SQL查詢不返回行
- 8. PDO查詢不返回行
- 9. PDO查詢不返回行
- 10. LINQ查詢不返回行
- 11. php查詢不返回行
- 12. Mysqli查詢不返回行
- 13. 設置包 - 默認值行爲?
- 14. 如何在沒有行從表返回時返回默認值
- 15. 如何爲Laravel中返回的Model :: All行設置查詢範圍?
- 16. Mysql的默認設置爲空,如果多行不匹配
- 17. android查看重置setNextFocusUpId默認行爲
- 18. Fusion Tables最大查詢設置數據爲0如果不返回行
- 19. 如何獲得ReadJson返回「默認」的行爲 - 好像CanConvert返回false
- 20. 如何將輸入字段返回到其默認行爲?
- 21. Npqsql查詢不返回任何行
- 22. SQL Server查詢不返回任何行
- 23. MySQL的:合併行,返回默認值
- 24. Birt設置參數默認SQL查詢
- 25. Hibernate:設置默認查詢超時?
- 26. 如何設置JComboBox返回到它的默認項目
- 27. 如何將UISegmentedControl設置回默認值
- 28. MySQL查詢返回的行
- 29. 將memcache默認設置爲symfony中的原則查詢的默認值
- 30. 如何等待查詢返回行?
什麼數據庫服務器是您使用時,SQL Server,Oracle,MySQL等? – duckworth 2008-11-12 22:47:35
如果您使用SQL Server,爲什麼接受只適用於Oracle的答案? – 2016-03-25 14:52:23