2017-10-04 72 views
3

我有一個查詢,像這樣:SQL - 默認選擇,如果空

SELECT id, name, price, floorplan 
FROM Inventory 
ORDER BY price 

這會從我的價格訂購Inventory表中返回的ID,名稱,價格,佈局規劃。通過這個查詢,我得到3行返回,最後一行有一個平面圖值,其他兩個是空的。是否有可能獲得非空的平面佈局來替換空的佈局圖列?我不想將這些分組,因爲我需要返回3行。

+1

哇,你給了很多建議bounties..one不過的,對預期的結果和當前結果SQL的問題,再加上張貼你已經嘗試將幫助 – TheGameiswar

回答

2

找出最大平面佈置圖的。使用isnull函數,每當它爲空時,將floorplan替換爲最大值。

SELECT id, 
     name, 
     price, 
     isnull(floorplan, (select max(floorplan) from Inventory)) 
    FROM Inventory 
ORDER BY price 
+0

這個工作好得多 – user979331

+0

isnull在這裏不需要,如果有超過1行的值不爲NULL,這個邏輯將失敗。然後,它會帶回額外的行。只需使用max()並刪除條件檢查就更明智了。 – scsimon

+0

@scsimon我只是想了解你的評論..你的意思是它會有一個錯誤'子查詢返回多行'?但子查詢中有一個最大值函數,所以我們不會在任何時候獲得一行以上的數據。 – Valli

2
SELECT id, name, price, 
     (SELECT TOP 1 floorplan FROM Inventory WHERE floorplan IS NOT NULL) as [floorplan] 
    FROM Inventory 

這應該適用於你的3行,但如果將有更多的記錄,我會放入TOP 1。你需要指定你想要的平面佈置圖,看是否超過1是不是空

+0

完美的!這工作!謝謝! – user979331

+0

使用沒有ORDER BY的TOP意味着你不關心*返回哪些*行。結果可能因每個查詢@ user979331而異。一些事情**非常**謹慎。 – scsimon

+0

這是錯誤的。沒有訂單,並不意味着你每次都得到不同的結果。如果沒有添加數據,每次都會得到相同的結果。它默認由羣集密鑰排序,在這種情況下應該是id – Bave

4

你可以使用一個窗口函數總喜歡max() over()

select 
    id 
    , name 
    , price 
    , max(floorplan) over() as floorplan 
from Inventory 
order by price 

rextester演示:http://rextester.com/GDWH85581

這個測試設置:

create table inventory (id int, name varchar(32), price decimal(9,2), floorplan int) 
insert into inventory values 
(1,'one',1.01,null) 
,(2,'two',2.02,null) 
,(3,'three',3.03,1024) 

回報:

+----+-------+-------+-----------+ 
| id | name | price | floorplan | 
+----+-------+-------+-----------+ 
| 1 | one | 1.01 |  1024 | 
| 2 | two | 2.02 |  1024 | 
| 3 | three | 3.03 |  1024 | 
+----+-------+-------+-----------+ 
+1

這不需要兩次訪問表 – TheGameiswar

1

考慮這個例子。我認爲子查詢應該是相關的。如果不是乾燥機得到平面佈置圖,但數據中沒有。由於

CREATE TABLE Inventory 
    (id int 
    ,name varchar(30) 
    ,price money 
    ,floorplan char(1) 
    ) 

    insert inventory 
    SELECT 1, 'Washer', 300, NULL 
    insert inventory 
    SELECT 1, 'Washer', 330, NULL 
    insert inventory 
    SELECT 1, 'Washer', 340, 'Y' 
    insert inventory 
    SELECT 2, 'Dryer', 275, NULL 

    SELECT id, name, price, 
     (SELECT TOP 1 floorplan FROM Inventory AS Y WHERE floorplan IS NOT NULL 
     AND Y.id = I.id) as [floorplan] 
    FROM Inventory AS I 

http://sqlfiddle.com/#!6/ca73e6/3

+0

我認爲這與其他答案和用戶只提到三行相同,所以我認爲不需要關聯 – TheGameiswar

+0

在sqlfiddle粘貼第一個查詢和乾燥器有平面佈置圖'Y'。那是正確的行爲? –