2015-09-24 19 views
0

即使沒有找到模擬具有默認值的正確結果集的行,我也想返回MySQL結果集。當沒有找到行時,MySQL返回值

這樣我就不必在顯示這些數據時有任何邏輯了......我可以把它推出去。

我想要做的總是返回3個倉庫... 000 CAL RET數值0時,沒有被發現。

如果添加了新的倉庫,我希望能夠修改它以包含該倉庫。

這裏所說:

http://sqlfiddle.com/#!9/e94bc

我希望回到另一行的RET倉庫中的所有列零。

如果查詢不存在的另一個ItemCode,我希望看到所有的3排000 CAL RET在每列零個值。

作爲獎勵我也想總是返回0而不是(NULL)作爲一個值。

我已經搜索了答案,但似乎無法找到我所需要的。

謝謝!

+0

你的小提琴壞了(請建立架構。) – Eric

+0

我想我修好了。我的意思是小提琴。 – Yourguide

回答

1
SELECT querytype, col1, col2, col3, ... 
FROM (SELECT 1 AS querytype, col1, col2, col3, ... 
     FROM YourTable 
     WHERE ... 
     UNION ALL 
     SELECT 2 AS querytype, 0, 0, 0, ... 
     UNION ALL 
     SELECT 2 AS querytype, 0, 0, 0, ... 
     UNION ALL 
     SELECT 2 AS querytype, 0, 0, 0, ...) AS x 
HAVING querytype = MIN(querytype) 

一切之前,首先UNION ALL是你的正常的查詢,但有一個額外querytype列。如果該查詢返回任何內容,則MIN(querytype)將爲1,這些行將與HAVING子句匹配。否則,MIN(querytype)將是2,並且默認行將匹配。

+0

您的查詢中一個微小的錯誤,它應該是'SELECT查詢類型,COL1,COL2,COL3,...'。否則,querytype將不會被找到。 – Jacobian

0

您可以在每個列中創建一個倉庫主表,其中0表示每個列。

CREATE TABLE ItemWarehouseMaster 
    (`Warehouse` varchar(3), `QOH` int, `QPO` int, `QSO` int, `QBO` int,`ItemCode` varchar(8)) 
; 

INSERT INTO ItemWarehouseMaster 
    (`Warehouse`, `QOH`, `QPO`, `QSO`, `QBO`, `ItemCode`) 

    ('CAL', 0, 0, 0, 0, 0), 
    ('RET', 0, 0, 0, 0, 0), 
    ('000', 0, 0, 0, 0, 0), 

然後將查詢可以加入這個表,如果,2組數據進行聚結,對每一列,你應該從一mastertable並從您的數據庫中的值0,從您的數據庫中的值爲空時,它將採用'主'表中的0。

SELECT 
    w.Warehouse, 
    coalesce (w.QOH,Mast.QOH), 
    coalesce (w.QSO,Mast.QSO), 
    coalesce (w.QPO,Mast.QPO), 
    coalesce (w.QBO,Mast.QBO) 
FROM 
    ItemWarehouseMaster Mast 
left join 
    ItemWarehouse w on 
w.warehouse = mast.warehouse 

And w.itemcode = '10052IP' 
+0

其實這似乎如此接近的工作,但是當我有一個項目的代碼查詢它不存在我沒有得到任何價值。它也沒有填充我可以告訴的空行。 – Yourguide

+0

啊,這裏應該是連接的一部分,所以它只加入那些匹配字符串的記錄。 – pancho018

0

我剛剛遇到了同樣的情況,我可以管理以類似的方式,雖然返回值Barmar描述,稍微簡單。

SELECT mycol FROM (
    SELECT mycol FROM mytable WHERE condcol = 'some value' 
    UNION SELECT 'hardcoded value' 
) alias 
LIMIT 1; 

如果第一個查詢沒有返回任何行,第二個查詢將始終返回硬編碼值。如果您需要返回更多硬編碼行,只需按需要添加UNION SELECT 'another value'多次。 最後的LIMIT語句可以讓您確保在找到實際行時不會返回硬編碼行。

請注意,您的原始查詢將成爲派生查詢,並且它必須具有別名。否則,你會看到這個錯誤: Error in query (1248): Every derived table must have its own alias。 我希望這有助於!

相關問題