2012-01-04 3 views
0

Это устаревший запрос, который я очищаю, и я смущаюсь с этим аргументом case, поэтому любая помощь будет принята с благодарностью.T-SQL Case Statement confusion

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. Есть идеи?

EDIT Я редактировал код, как показано ниже, для облегчения читаемости и я все еще получаю пустой ...

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 + ' 
' 

EDIT х 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

+0

Возможно ли, что 'deliv.dtmdeliverydate' является NULL? Я бы надеялся, что с тех пор, как ваш бит-бит будет равен 1 в этом случае. –

+0

@PhilKlein no is not null – EvanGWatkins

ответ

2

Предложение о Заявлении случай это

WHEN bitdelivered = 1 

Так что никогда не будет идти в Заявлении ELSE, который Вам кажется, что он должен на это заявление " однако, если я получаю 1 вернулся, то я вернусь нулем вместо еще блока»

Если вы получаете аннулируют из этого саза его потому, что deliv.dtmdeliverydate является NULL и CONCAT_NULL_YIELDS_NULL установлен в ON

Вы должны исправить это, используя COALESCE или ISNULL. Вы можете изменить настройку CONCAT_NULL_YIELDS_NULL на OFF, но я не рекомендую это, так как этот параметр удивляет людей.

Однако, как мы выяснили в ходе our discussion ИНЕКЕ на производной таблице

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

+1

@EvanGWatkins: в этом случае проблема не в том коде, который вы нам дали. – gbn

0

если deliv.dtmdeliverydate равно нулю, когда ваш bitdelivered является 1, то полученное значение будет нулевым ..