虽然我看到更新语句基于现有值更新字段,但我找不到类似于这种情况的任何内容:
假设您的表只有一列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功能,但不知道如何完成此功能。
提前致谢。
答案 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
) ,'' )