Oracle UPDATE从列数据中删除前缀值

时间:2013-04-22 09:50:58

标签: sql oracle

我有以下查询,其中p_id前缀为p_number

UPDATE table1 t1 
   SET t1.p_id = CONCAT((SELECT CONCAT(t2.p_number,' ') 
                           FROM tble2 t2 
                          WHERE t2.id = t1.p_id)
                        , t1.p_id) 
 WHERE t1.p_id = '19680';

基本上采用像

这样的值
t2.p_number:X12
t1.p_id:    19680

并将其变为

t2.p_number:X12
t1.p_id:    X12 19680

我被要求的是一个'回滚'脚本,记住唯一一个我知道价值的栏目是'19680'! 我查看了REPLACE命令,但不确定是否可以让它工作;任何想法?


解决!

谢谢大家,在那里有一个很好的技巧记录,我最终看到Ben的一个非常简单的查询。

这个问题背后有相当多的历史,基本上客户已输入p_id的值并且已输入重复项。因此,他们希望将p_number添加到p_id上以使它们再次成为唯一(一旦输入客户端无法更新),但是他们也想要一个get-out子句,以防出现问题所以他们希望能够删除前缀数据。

p_id实际上是在系统中使用的,因此虚拟表和代码更改在这种情况下并不真正可行,而只是更新客户端的数据是最容易的。

干杯们,希望客户对提案感到满意。

4 个答案:

答案 0 :(得分:1)

这是我的2c。

不要更新原始字段。如果您有可能想要将其回滚,那么您会遇到大量问题。创建使用新值更新的新字段。如果要引用此字段,可以执行此操作。当你想引用另一个字段时,你可以这样做。

更一般地说,对于您想要“修复”的任何字段,这都是一个很好的策略。您可以在以后改进您正在“修复”的内容,如果您已覆盖原始数据,则无法完成。始终保留原始数据,然后您可以根据需要重复使用它。

如果您要做的就是删除第一个空格之前的所有内容,那么以下内容将起作用:

update the_table
   set p_id = substr(p_id, instr(p_id, ' ') + 1);

SQL Fiddle

答案 1 :(得分:1)

作为一般规则,请勿存储推断的数据。

只需在客户端代码中,或在VIEW或虚拟列(Oracle 11)中为字段添加前缀,而无需修改原始值。由于您尚未对其进行修改,因此无需回滚。

答案 2 :(得分:0)

如果您正在询问如何简单地执行此操作,请将前缀修剪至空格并恢复原始值。如果你正在寻找一个更好的选择,那么我会说创建另一个像“old_p_id”的列,然后将旧的列推入其中。如果要回滚,可以随时使用old_p_id更新p_id。

+----------------------+
¦ p_id      ¦ old_p_id ¦
¦-----------+----------¦
¦ X12 19680 ¦  19680   ¦
¦ X13 19681 ¦  19681   ¦
+----------------------+

答案 3 :(得分:0)

您使用的是哪个版本的Oracle?如果是Oracle 11g,你可以使用虚拟列!

alter table table1
add new_column as p_number || ' ' || p_id;

我假设您的所有列都是varchar类型。

使用这种方法,您将不得不更新客户端代码以引用新列。

相关问题