2017-08-04 127 views
3

我想解決一個問題,我似乎無法找到一個簡單的解決方案。我試圖編寫一個查詢,它使用一個case語句來返回基於某些值的值。在同一個查詢中,我還需要返回一個orderid,因爲我需要將這個返回的數據用於另一個查詢。SQL Server的情況下,當沒有行返回時,返回一個值時,SQL Server的情況下

下面是查詢:

select CASE WHEN count(name) = 0 THEN '1' ELSE CONVERT(varchar,count(name) + 1) END AS box 
, orderid 
from order 
where len(name) = 7 
and orderid = 'XYZ' 
group by orderid 

上面的問題是,你可以想像,一個行只有當一個長度爲7名在數據存在返回。無論如何,我需要這個查詢來返回一個有效的值。

查詢應該返回:1, XYZ當沒有長度爲7的名稱存在時。當存在有效的7長度名稱時,查詢確實有效。

處理此問題的最佳方法是什麼?請注意,數據可以包含長度小於7的多個名稱。在事務發生後,這些名稱將更改爲長度7。

下面是樣本數據和預期的結果:

NAME  ORDERID 
ABC  001 
XYZ  001 
123  001 
OOP  002 
LMT  002 

當我跑我的orderid = '1'查詢,查詢應該返回1, 001。數據將不斷變化,所以最初如上圖所示。由於交易發生時,數據將被改變:

NAME   ORDERID 
    ABCABCABC  001 
    XYZ   001 
    123   001 
    OOP   002 
    LMT   002 

在這一點上,我不擔心我上面的查詢,因爲它會返回一個有效行:2, 001

問題是當名稱列我們不正確的長度,查詢返回什麼。

+0

使用從一個查詢的數據得到的數據用於另一個查詢通常是一個很好的指示器,需要一個'JOIN'和可能更好的過濾器。一次調用數據庫獲取你想要的數據比多次調用要好得多。 – Shawn

+0

不幸的是,我不能加入它的過濾器,就像使用了上面的表/邏輯一樣,由於沒有名稱,連接將返回沒有行,長度爲7。一旦數據存在,這個問題就解決了,但直到這一點它不起作用。 – Help123

+0

樣本數據和期望的結果真的有幫助。 –

回答

2

你可能想這:

select convert(varchar(255), 
       sum(case when len(name) = 7 and orderid = 'XYZ' then 1 else 0 end) + 1 

        end) as box, 
     orderid 
from order 
group by orderid; 

這將所有的過濾邏輯移動到select

如果你想要的是一排用數量和訂單ID優選爲XYZ但別的東西,如果這是不可用:

select convert(varchar(255), 
       sum(case when len(name) = 7 and orderid = 'XYZ' then 1 else 0 end) + 1 

        end) as box, 
     coalesce(max(case when orderid = 'XYZ' then orderid end), 
       max(orderid) 
       ) as orderid 
from order 
group by orderid; 
+0

我認爲你的第一個查詢將起作用。我從case子句中刪除了orderid,因爲我需要返回所有訂單的值並將其過濾爲我需要的值。我會繼續使用該查詢進行測試,但從我的初步測試看起來不錯 – Help123

+0

你能解釋一下爲什麼使用總和?試圖瞭解解決方案背後的邏輯。是否在orderid組中使用總和來總結case語句的每個返回值? – Help123

+0

@ Help123。 。 。 'sum()'用於計算匹配「where」子句中條件的行數。 –

0

時沒有名字有lenth 7,那麼你應該使用下面的查詢

選擇CASE WHEN計數(名稱)= 0和len(名)!= 7 THEN '1' ELSE CONVERT(VARCHAR,計數(名稱) + 1)END AS框 ,訂單ID從訂單 其中訂單ID =「XYZ」 組由訂單ID

+0

該查詢不起作用,返回2.它跳過初始檢查並進入case語句的ELSE部分。 – Help123

0

漂亮難看而是由左接合至由1個記錄,的一個共線視圖 在乙每個記錄得到XYZ所以我們保證至少有1條記錄;如果order的名稱長度爲7,那麼我們使用這些值,否則順序左連接將爲null,我們合併內聯視圖中的值。

通常我會在用戶界面中做這種事情,如果沒有記錄被返回,在Presentation層處理,而不是在這裏。

但是如果你必須:

UNTESTED(我看不到一個邏輯漏洞又或者是一個語法之一,但我沒有一個環境下測試)

SELECT coalesce(CASE WHEN count(a.name) = 0 
        THEN '1' 
        ELSE CONVERT(varchar,count(a.name) + 1) END 
       ,b.Box) AS box 
    , coalesce(a.orderid,b.orderID) 
FROM (SELECT '1' Box, 'xyz' OrderID) b 
LEFT join [order] A 
on 1=1 
and len(a.name) = 7 
and a.orderid = 'XYZ' 
GROUP BY coalesce(a.orderid,b.OrderID) 
+0

將inlineview b中的列重命名,以便更易於遵循。 – xQbert

相關問題