如何通过确定字段中的每个数字来更新字段值?

时间:2017-06-05 23:05:47

标签: sql oracle

虽然我看到更新语句基于现有值更新字段,但我找不到类似于这种情况的任何内容:

假设您的表只有一列number(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功能,但不知道如何完成此功能。

提前致谢。

4 个答案:

答案 0 :(得分:2)

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

这就是你追求的目标吗?

答案 1 :(得分:1)

所以,似乎你需要将每个0和1转换为4,并保留所有其他数字。这看起来像一个字符串操作(并且对“数字”的引用本身表示相同的事情)。因此,将数字转换为字符串,使用Oracle TRANSLATE函数(请参阅文档),然后转换回数字。

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

答案 2 :(得分:0)

我对面试问题的回答是,数据库设计违反了规范化规则(即糟糕的设计),如果设计得当,就不会出现这种“更新异常”。话虽如此,使用单行函数的各种组合以及所需的算术运算,可以很容易地完成表达式。

答案 3 :(得分:-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语句添加每个数字,然后将数字连接回字符串

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
       ) ,'' )