Null

需要有關空欄位值的幫助

  • April 28, 2016

我遇到語法問題。我有以下語句,它使用來自不同表中的欄位的值更新表中的欄位。我需要該語句使用欄位 142 中的文本更新該欄位,除非欄位 142 為空,然後使用欄位 17 進行更新。這是現有程式碼:

--Defendant Address
update xrji_:Usernum 
   set DefendantAddress=trim(MemoText)
from eqanswer
where eqanswer.entitynum=xrji_:Usernum.DefendantEntityNum and
                      entityrole='DEFENDANT' and fieldnum=142
; 

MemoTextentityrolefieldnum屬於eqanswer表。

讓我知道這是否需要進一步澄清。任何建議,將不勝感激。

DBMS 是:優勢

這裡的主要困難可能是在fieldnum =142 值為 null的情況下要使用的*MemoText的替代值位於不同的行中。*如果它只是同一行的不同列,那會容易得多。這樣你就可以使用Manu 建議的模式——我的意思是這部分:

set <field_to_update> = ISNULL(<field142>, <field17>)

如果該值不為空,則ISNULL函式將計算為,否則該函式將計算為。<field142>``<field17>

那麼是否可以將來自不同行的兩個值排列在同一行上?是的,至少有兩種方法可以做到這一點。

首先,您可以用派生表替換eqanswer引用,該表按entitynum對**eqanswer行進行分組,並使用條件聚合在同一行上顯示欄位 142 和欄位 17 值,如下所示:

SELECT
 entitynum,
 MAX(CASE fieldnum WHEN 142 THEN MemoText END) AS MemoText142,
 MAX(CASE fieldnum WHEN 17  THEN MemoText END) AS MemoText17
FROM
 eqanswer
WHERE
 entityrole = 'DEFENDANT'
 AND fieldnum IN (142, 17)
GROUP BY
 entitynum

現在您可以在 UPDATE 語句中使用上述查詢,如下所示:

UPDATE
 xrji_:Usernum
SET
 DefendantAddress = TRIM(ISNULL(eqa.MemoText142, eqa.MemoText17))
FROM
 (
   SELECT
     entitynum,
     MAX(CASE fieldnum WHEN 142 THEN MemoText END) AS MemoText142,
     MAX(CASE fieldnum WHEN 17  THEN MemoText END) AS MemoText17
   FROM
     eqanswer
   WHERE
     entityrole = 'DEFENDANT'
     AND fieldnum IN (142, 17)
   GROUP BY
     entitynum
 ) AS eqa
WHERE
 eqa.entitynum = xrji_:Usernum.DefendantEntityNum
;

另一種方法需要將eqanswer表連接到xrji_:Usernum兩次:一次獲取欄位 142 MemoText,再次獲取欄位 17 MemoText。為此,重寫 UPDATE 以使用顯式連接會更方便。完整的語句看起來像這樣:

UPDATE
 xun
SET
 DefendantAddress = TRIM(ISNULL(eqa142.MemoText, eqa17.MemoText))
FROM
 xrji_:Usernum AS xun
 LEFT JOIN eqanswer AS eqa142 ON eqa142.entitynum = xun.DefendantEntityNum
   AND eqa142.entityrole = 'DEFENDANT'
   AND eqa142.fieldnum = 142
 LEFT JOIN eqanswer AS eqa17 ON eqa17.entitynum = xun.DefendantEntityNum
   AND eqa17.entityrole = 'DEFENDANT'
   AND eqa17.fieldnum = 17
WHERE
 eqa142.entitynum IS NOT NULL
 OR eqa17.entitynum IS NOT NULL
;

您可以看到此 UPDATE 語句使用與之前的 UPDATE 相同的 ISNULL 模式。不同之處僅在於來自不同行的MemoText值如何管理在同一行上。這一次,它們只是來自不同的、獨立連接的eqanswer子集。

該查詢使用外連接而不是內連接,因為假設任何給定的entitynum可能不存在欄位 142 或欄位 17 。該查詢仍會檢查是否存在兩行中的至少一個 - 否則相應的xrji_:Usernum行根本不會更新。如果您仍想更新此類行(顯然是 null),只需刪除 WHERE 子句。

引用自:https://dba.stackexchange.com/questions/136509