2017-06-05 110 views
1

雖然我看到更新語句根據現有值更新字段,但找不到類似於此場景的任何內容:如何通過確定字段中的每個數字來更新字段值?

假設您的表格只有一列數字(4)類型的列。第一條記錄中的值爲1010.

create table stab(
    nmbr number(4) 
); 

insert into stab values(1010); 

For each digit 
    When the digit is 1 -- add 3 to the digit 
    When the digit is 0 -- add four to the digit 
end 

此操作需要在不使用pl/sql的單個語句中完成。

我認爲substr函數需要使用,但不知道如何去完成這個。

在此先感謝。

回答

2
SELECT DECODE(SUBSTR(nmbr,1,1), '1', 1 + 3, '0', 0 + 4) AS Decoded_Nmbr 
FROM stab 
ORDER BY Decoded_Nmbr 

這就是你在做什麼之後?

+0

令人懷疑。 OP是在某種更新之後,而不是SELECT語句。另外,我不明白哪裏有提到訂購任何東西的地方。 – mathguy

+0

@NDin - 這是做你要求的嗎?您對每個數字**表示**,但這隻會處理第一位數字。你說「更新值」,這是一個SELECT。難怪你不會得到那份工作。 – mathguy

1

所以,你似乎需要將每個0和1轉換爲4,並將所有其他數字單獨保留。這看起來像一個字符串操作(並且對「數字」本身的引用表明了同樣的事情)。因此,將數字轉換爲字符串,使用Oracle TRANSLATE函數(請參閱文檔),然後轉換回數字。

update stab 
set nmbr = to_number(translate(to_char(nmbr, '9999'), '01', '44')) 
; 
-1

假設它始終是一個4位數#;你可以使用子像下面 - Postgres的SQL例如

SELECT CASE 
     WHEN a = 0 THEN a + 4 
     ELSE a + 3 
     end AS a, 
     CASE 
     WHEN b = 0 THEN b + 4 
     ELSE b + 3 
     end AS b, 
     CASE 
     WHEN c = 0 THEN c + 4 
     ELSE c + 3 
     end AS c, 
     CASE 
     WHEN d = 0 THEN d + 4 
     ELSE c + 3 
     end AS d 
FROM (SELECT Substr('1010', 1, 1) :: INT AS a, 
       Substr('1010', 2, 1) :: INT b, 
       Substr('1010', 3, 1) :: INT c, 
       Substr('1010', 4, 1) :: INT d)a 

---其他選項可(試圖在PostgreSQL :))使用regexp_split_to_table進行分裂數;再加入個人基礎上,每個數字case語句,然後CONCAT數字回字符串

SELECT array_to_string (array 
     (
       select 
        case 
          WHEN val = 0 THEN val +4 
          ELSE val +3 
        END 
       FROM (
          SELECT regexp_split_to_table ('101010','') ::INT val 
        ) a 
     ) ,'') 
+0

爲什麼提供一個Postgres解決方案(這絕對不會在Oracle中工作),當OP明確將其標記爲Oracle並在帖子中提到PL/SQL時(意思是說,它確實是Oracle,這不是錯誤)? – mathguy

+0

感謝您的回覆!這實際上是一個面試問題,他們指出應該使用Oracle上的SQL來完成,而不使用PL/SQL。 –

+0

您的輸入真的有幫助,我修改了腳本,如下所示,並找到更新多個記錄的方法。下面的腳本只能在單個記錄上工作: –

0

我的回答面試問題將是該數據庫的設計違反了規範化規則(即一個不好的設計),不會有這樣的「更新異常「,如果設計得當的話。話雖如此,可以很容易地用一個表達式來完成,該表達式使用單行函數的各種組合和所需的算術運算。