Путаница с T-SQL - PullRequest
       38

Путаница с T-SQL

0 голосов
/ 04 января 2012

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

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, то я возвращаю ноль вместо блока 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

Ответы [ 4 ]

2 голосов
/ 04 января 2012

Предложение оператора CASE выглядит следующим образом:

WHEN bitdelivered = 1

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

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

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

Однако, как мы выяснили во время нашего обсуждения предложение WHERE для производногоТаблица

WHERE clins.guidrequirementid = req.guidrequirementid AND deliv.bitdelivered = 0 означает, что

CASE WHEN bitdelivered = 1

никогда не будет оцениваться.

1 голос
/ 04 января 2012

Вы можете упростить это для одного.Возможно, я пропустил несколько возвратов каретки

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 + '
'
1 голос
/ 04 января 2012

Вполне вероятно, что deliv.dtmdeliverydate в этом случае NULL.

Если это так, то CONVERT(CHAR(10), deliv.dtmdeliverydate, 101) даст NULL, а объединение в строку даст NULL.

0 голосов
/ 04 января 2012

если значение deliv.dtmdeliverydate равно нулю, если количество доставленных битов равно 1, тогда результирующее значение будет равно нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...