2012-01-04 59 views
0

這是一個傳統的查詢,我正在清理,我對這個case語句感到困惑,所以任何幫助將不勝感激。T-SQL病例陳述混淆

SELECT CASE 
    WHEN bitdelivered = 1 THEN 
    '' + CONVERT(CHAR(10), deliv.dtmdeliverydate, 101) 
    + '                ' 
    + 'þ' + ' 
' -- this is a carriage return, do not remove it 
    WHEN bitdelivered = 0 AND deliv.dtmdeliverydate < Getdate() THEN 
    '' + CONVERT(CHAR(10), deliv.dtmdeliverydate, 101) 
    + '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' 
    + '&#168;' + ' 
' 
    ELSE 
    '' + CONVERT(CHAR(10), deliv.dtmdeliverydate, 101) 
    + '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' 
    + '&#168;' + ' 
' 
END 

就像我說的這是非常骯髒,但是當我運行整個查詢,如果我得到一個0 bitdelivered的casestatement的作品,因爲它應該,但如果我有1回,然後我返回null而不是else塊。有任何想法嗎?

編輯我已編輯的代碼如下所示,可讀性更強,我仍然得到空...

select 
CONVERT(CHAR(10), deliv.dtmdeliverydate, 101) + 
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' + 
CASE 
    WHEN bitdelivered = 1 THEN '&#254;' 
    ELSE '&#168;' 
END + ' 
' 

編輯×2這裏是整個(很討厭的,我知道的)SQL查詢,我沒有寫這個,我只是試圖把它清理乾淨......

SELECT dbo.tblrequirements.guidrequirementid, 
     tblcontracting.strdescription        AS 
     strcontracting, 
     dbo.viewawardnumbers.strcontractnumber     AS 
     strawardnumber, 
     Ltrim(Rtrim(dbo.viewawardnumbers.strtonumber))   AS strtonumber, 
     dbo.tblrequirements.strdescription, 
     dbo.tblezquerycontractvalue.curtotalvalue, 
     dbo.tblcodescontractvehicles.strdescription    AS 
     strcontractvehicle, 
     tblcustomer.stracronym         AS strcustomer, 
     dbo.tblcodesrequirementstatuses.strdescription   AS strstatus, 
     Substring(dbo.tblrequirements.strnotes, 0, 512)   AS strnotes, 
     Coalesce (dbo.tblrequirements.guidfromid, 
     '00000000-0000-0000-0000-000000000000' 
     )               AS guidfromid, 
     Coalesce (dbo.viewteammembers.guidpersonid, 
     '00000000-0000-0000-0000-000000000000')     AS guidpersonid 
     , 
     dbo.viewcurrentoptions.dtmstart, 
     dbo.viewcurrentoptions.dtmend, 
     Dateadd(d, -60, dbo.viewcurrentoptions.dtmend)   AS 
     dtm1stnoticedue, 
     Dateadd(d, -30, dbo.viewcurrentoptions.dtmend)   AS 
     dtm2ndnoticedue, 
     dbo.tblcontractdates.dtmcontractstart, 
     dbo.tblcontractdates.dtmcontractend, 
     Isnull(dbo.viewteammembers.strshortname, ' Not Assigned') AS strshortname 
     , 
     dbo.tblezqueryfunding.curtotalfunded, 
     CASE 
     WHEN (dbo.tblcodesrequirementstatuses.strdescription = 
       'Pre-Solicitation' 
       OR dbo.tblcodesrequirementstatuses.strdescription = 
        'Solicitation' 
       OR dbo.tblcodesrequirementstatuses.strdescription = 
        'Source Selection' 
      ) THEN 'P' 
     WHEN (Coalesce (dbo.tblcodesprocurementtypes.strcode, '') <> 'IT' 
       AND Coalesce (dbo.tblcodesprocurementtypes.strcode, '') <> 'OPS' 
      ) THEN 
     'S' 
     ELSE 'C' 
     END              AS strproctype, 
     dbo.tblcodesprocurementtypes.strcode, 
     dbo.tblcodesprocurementtypes.strdescription    AS strprocdesc, 
     deliveries.dtmdeliverydate, 
     deliveries.bitdelivered, 
     CASE 
     WHEN (dbo.tblcodesrequirementstatuses.strdescription = 
       'Pre-Solicitation' 
       OR dbo.tblcodesrequirementstatuses.strdescription = 
        'Solicitation' 
       OR dbo.tblcodesrequirementstatuses.strdescription = 
        'Source Selection' 
      ) THEN 'Initial Start Date' 
     WHEN (Coalesce (dbo.tblcodesprocurementtypes.strcode, '') <> 'IT' 
       AND Coalesce (dbo.tblcodesprocurementtypes.strcode, '') <> 'OPS' 
      ) THEN 
     'POP' 
     ELSE 'Delivery Date' 
     END              AS 
     colpopdelivdt, 
     CASE 
     WHEN (dbo.tblcodesrequirementstatuses.strdescription = 
       'Pre-Solicitation' 
       OR dbo.tblcodesrequirementstatuses.strdescription = 
        'Solicitation' 
       OR dbo.tblcodesrequirementstatuses.strdescription = 
        'Source Selection' 
      ) THEN 'Req Award Date' 
     WHEN (Coalesce (dbo.tblcodesprocurementtypes.strcode, '') <> 'IT' 
       AND Coalesce (dbo.tblcodesprocurementtypes.strcode, '') <> 'OPS' 
      ) THEN 
     'Option Notice' 
     ELSE 'Delivered' 
     END              AS 
     coloptnotdeliv, 
     tblpresolicitations.dtmcontacted, 
     tblpresolicitations.dtmrequiredby, 
     tblpresolicitations.dtmawardnotice, 
     strjobid, 
     bitprimary 
FROM dbo.tblrequirements 
     INNER JOIN dbo.tblcodesrequirementstatuses 
     ON dbo.tblcodesrequirementstatuses.strcode = 
      dbo.tblrequirements.strstatusid 
     LEFT OUTER JOIN dbo.tblezquerycontractvalue 
     ON dbo.tblezquerycontractvalue.guidrequirementid = 
      dbo.tblrequirements.guidrequirementid 
     LEFT OUTER JOIN dbo.viewawardnumbers 
     ON dbo.viewawardnumbers.guidrequirementid = 
      dbo.tblrequirements.guidrequirementid 
     LEFT OUTER JOIN dbo.tblezqueryfunding 
     ON dbo.tblezqueryfunding.strawardnumber = 
      dbo.viewawardnumbers.strawardnumber 
     LEFT OUTER JOIN dbo.viewcurrentoptions 
     ON dbo.tblrequirements.guidrequirementid = 
      dbo.viewcurrentoptions.guidrequirementid 
     LEFT OUTER JOIN dbo.viewteammembers 
     ON dbo.viewteammembers.guidrequirementid = 
      dbo.tblrequirements.guidrequirementid 
     LEFT OUTER JOIN dbo.tblcontracts 
     ON dbo.tblcontracts.guidrequirementid = 
      dbo.tblrequirements.guidrequirementid 
     LEFT OUTER JOIN dbo.tblcontractdates 
     ON dbo.tblcontractdates.guidrequirementid = 
      dbo.tblrequirements.guidrequirementid 
     LEFT OUTER JOIN dbo.tblcodescontractvehicles 
     ON dbo.tblcodescontractvehicles.strcode = dbo.tblcontracts.strvehicleid 
     LEFT OUTER JOIN dbo.tblorganizations AS tblcontracting 
     ON dbo.tblrequirements.guidfromid = tblcontracting.guidorgid 
     LEFT OUTER JOIN dbo.tblorganizations AS tblcustomer 
     ON dbo.tblrequirements.guidtoid = tblcustomer.guidorgid 
     LEFT OUTER JOIN dbo.tblpresolicitations 
     ON dbo.tblpresolicitations.guidrequirementid = 
      dbo.tblrequirements.guidrequirementid 
     LEFT OUTER JOIN dbo.tblcodesprocurementtypes 
     ON dbo.tblcodesprocurementtypes.strcode = 
      dbo.tblpresolicitations.strprocurementtypeid 
     LEFT OUTER JOIN (SELECT guidrequirementid, 
           REPLACE(REPLACE(REPLACE (
(select 
ISNULL(CONVERT(CHAR(10), deliv.dtmdeliverydate, 101), '(no date)') + 
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' + 
CASE 
    WHEN bitdelivered = 1 THEN '&#254;' 
    ELSE '&#168;' 
END + ' 
' 



             /*(SELECT CASE 
               WHEN bitdelivered = 1 
               THEN 
               '' 
               + 
               CONVERT(CHAR(10), 
     deliv.dtmdeliverydate, 
     101) + 
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' 
+ '&#254;' + ' 

' 
WHEN bitdelivered = 0 
AND deliv.dtmdeliverydate < Getdate() THEN 
'' + 
CONVERT(CHAR(10), deliv.dtmdeliverydate, 101) + 
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' 
+ '&#168;' + ' 

' 
ELSE 
'' + CONVERT(CHAR(10), deliv.dtmdeliverydate, 101) + 
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' 
+ '&#168;' + ' 

' 
END*/ 
FROM tblclins clins 
INNER JOIN tblcommodities commod 
ON commod.guidclinid = clins.guidclinid 
INNER JOIN tbldeliveries deliv 
ON deliv.guidcommodityid = commod.guidcommodityid 
WHERE clins.guidrequirementid = req.guidrequirementid 
AND deliv.bitdelivered = 0 
ORDER BY guidrequirementid, 
deliv.dtmdeliverydate 
FOR XML PATH('')), '&lt;', '<'), '&gt;', '>'), '&amp;', '&') AS dtmdeliverydate 
, 
Stuff ((SELECT '|' + CAST(bitdelivered AS CHAR(1)) 
FROM tblclins clins 
INNER JOIN tblcommodities commod 
ON commod.guidclinid = clins.guidclinid 
INNER JOIN tbldeliveries deliv 
ON deliv.guidcommodityid = commod.guidcommodityid 
WHERE clins.guidrequirementid = req.guidrequirementid 
ORDER BY guidrequirementid 
FOR XML PATH('')), 1, 1, '')       AS bitdelivered 
FROM tblrequirements req 
GROUP BY guidrequirementid) deliveries 
    ON deliveries.guidrequirementid = dbo.tblrequirements.guidrequirementid 
+2

上帝保佑你,這是醜陋=/ – Yuck 2012-01-04 16:29:38

+0

難道'deliv.dtmdeliverydate'爲空?我希望不會因爲你的'bitdelivered'是1。 – 2012-01-04 16:30:34

+0

@PhilKlein不是不是null – EvanGWatkins 2012-01-04 16:33:51

回答

2

case語句的子句是這個

WHEN bitdelivered = 1 

所以它永遠不會進入else語句,你認爲它應該被這句話「但是如果我得到一個1返回,然後我返回null而不是別的塊」

的。如果你從這個case語句越來越空了,因爲deliv.dtmdeliverydateNULLCONCAT_NULL_YIELDS_NULL設置爲ON

您應該使用COALESCEISNULL來解決此問題。您可以將設置CONCAT_NULL_YIELDS_NULL更改爲關閉,但我不建議這樣做,因爲此設置令人驚訝。

但是正如我們在派生表中our discussion想通了WHERE子句

WHERE clins.guidrequirementid = req.guidrequirementid AND deliv.bitdelivered = 0意味着

CASE WHEN bitdelivered = 1

將永遠不會被評估。

1

很可能deliv.dtmdeliverydate是在這種情況下NULL

如果是,則CONVERT(CHAR(10), deliv.dtmdeliverydate, 101)將產生NULL,並將其連接到字符串將產生NULL

1

您可以將其簡化爲一個。我可能已經錯過了幾回車

ISNULL(CONVERT(CHAR(10), deliv.dtmdeliverydate, 101), '(no date)') + 
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' + 
CASE 
    WHEN bitdelivered = 1 THEN '&#254;' 
    ELSE '&#168;' 
END + ' 
' 
+0

我現在使用了你的簡化,但是它仍然返回null而不是'沒有日期' – EvanGWatkins 2012-01-04 16:40:16

+1

@EvanGWatkins:在這種情況下,問題不在你給我們的代碼中。 – gbn 2012-01-04 16:49:39

0

如果deliv.dtmdeliverydate爲空當你bitdelivered爲1,然後將得到的值將是空..