2011-09-06 108 views
0

我需要編寫一個SQL查詢,以從兩列數據中的一個(基於哪個數據可用且不爲空)中獲取數據並將其附加到將靜態文本轉換爲同一個表中的另一列。基於表中其他列數據的SQL查詢更新

有人可以告訴我如何寫這個?

示例數據:

ID Type Barcode Serial No Location 

1 Test ABCD  1234  LOC1 
2 Test EFGH  NULL  LOC2 
3 Test NULL  5678  LOC3 
4 Test NULL  NULL  LOC1 

最終數據REQD在格式

ID Type Barcode Serial No Location 

1 Test ABCD  1234  LOC1-ABCD (Append barcode if its not null) 
2 Test EFGH  NULL  LOC2-EFGH (Append barcode if its not null) 
3 Test NULL  5678  LOC3-5678 (Append serial no since barcode is null) 
4 Test NULL  NULL  LOC1  (Both r Null keep loc as it is) 

請幫我在這....真的被困在此:(

數據庫是Oracle 10。

Supra

更新1:

非常感謝Marco對您的幫助....位置字段只需在將同一表中的條形碼/序列號附加到位置字段後更新。您編輯查詢不工作:(...請讓我知道如果我需要提供一些更多的信息/數據

最後更新:

Shesek的答覆工作完美:d ...你是男人:)...由於一噸:d

回答

0

根據您對其他答案的評論,

UPDATE Network_Plant_Items 
    SET FULL_ADDRESS = 'foobar' || COALESCE(BARCODE, MANUF_SERIAL_NUMBER) 
    WHERE BARCODE IS NOT NULL OR MANUF_SERIAL_NUMBER IS NOT NULL 

如果要追加這FULL_ADDRESS的電流值,因爲我從原來的問題理解,

UPDATE Network_Plant_Items 
    SET FULL_ADDRESS = FULL_ADDRESS || COALESCE(BARCODE, MANUF_SERIAL_NUMBER) 
    WHERE BARCODE IS NOT NULL OR MANUF_SERIAL_NUMBER IS NOT NULL 

COALESCE()返回您傳遞給它的第一個非空參數。請參閱Oracle的manual page on it

正如其他答案所建議的一般FIY NVM()COALESCE()舊的Oracle特定版本,其工作原理相同 - 但它只支持兩個參數並評估第二個參數,即使第一個參數是非零(或換句話說,不是短路評估)。一般來說,應該避免使用它,而應該使用標準COALESCE,除非明確需要評估所有參數,即使不需要它們。

+0

謝謝謝塞克....完美地工作:D – Supra

1

試試這個:

SELECT ID, Type, Barcode, "Serial No", 
CASE 
    WHEN Barcode IS NOT NULL THEN Location || '-' || Barcode 
    WHEN "Serial No" IS NOT NULL THEN Location || '-' || "Serial No" 
    ELSE Location 
FROM your_table 

看看CASE functionString Concat
我不知道我逃出序列號場的方式,反正看here

編輯:
試試這個:

UPDATE your_table SET Location = 
CASE 
    WHEN Barcode IS NOT NULL THEN Location || '-' || Barcode 
    WHEN "Serial No" IS NOT NULL THEN Location || '-' || "Serial No" 
    ELSE Location 
+2

@Supra:請不要將**代碼塊放入評論中 - 它們**非常難**閱讀.....而是:**通過編輯**更新您的原始問題**提供更多信息! –

+0

@Supra:看看我編輯的代碼。我沒有Oracle,所以我無法測試查詢... – Marco

+0

非常感謝Marco的幫助....位置字段只需在表格中添加條形碼/序列號之後在表格中更新爲位置字段。你編輯的查詢不起作用:(...請讓我知道,如果我需要給一些更多的信息/數據 – Supra

0

沒有安裝甲骨文,所以可以」噸測試查詢,但這應該工作....

你可以使用NVL功能,但它是很好的2個選項

update myTable 
set myCol = NVL(colA,colB) 

既然你卻想連接,當且僅(如果它不是空的,如果是,使用值b使用價值一)如果你從任一列非空值,則需要得到一點棘手和使用相結合嵌套NVL()

update myTable 
set myCol = myCol || CASE NVL(NVL(colA,colB),0) WHEN 0 THEN '' ELSE '-' || NVL(colA,colB) 

說明:

  • NVL(可樂,COLB)將評估爲可口可樂第一,COLB如果可樂空,空,如果都爲null
  • 在所有的情況下,我返回列的值
  • 我再追加 - 如果兩者都爲空,我基本上是附加了2個空字符串(''和NULL);否則,我正在追加' - ',並且我評估的值爲
  • 我使用CASE語句來執行IF .. ELSE來計算是否需要' - '
  • 我使用嵌套的NVL函數來分配0兩者都是空的情況下作出邏輯容易
  • 然後我附上我的評估值

正如我以前說過,這是未經測試,所以可能會有一些語法問題,但邏輯是正確的:-)

+0

查找其中一個不爲空的行是否更容易? – shesek