需要有關空欄位值的幫助
我遇到語法問題。我有以下語句,它使用來自不同表中的欄位的值更新表中的欄位。我需要該語句使用欄位 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 ;
列MemoText、entityrole和fieldnum屬於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 子句。