Sql 从现有列中的数据在数据库中创建新列

Sql 从现有列中的数据在数据库中创建新列,sql,oracle,Sql,Oracle,我有一张桌子 TableName: MACAddresses Columns: - Computer - MACAddress 我想创建一个sql脚本,创建一个新列,并使用冒号ie with Substring正确格式化mac地址,以创建一个名为CorrectMAC的新列 如何使用Oracle实现这一点?以下是一些测试数据: SQL> select * from MACAddresses 2 / COMPUTER MACADDRESS ---------- ---------

我有一张桌子

TableName: MACAddresses
Columns:
- Computer
- MACAddress
我想创建一个sql脚本,创建一个新列,并使用冒号ie with Substring正确格式化mac地址,以创建一个名为CorrectMAC的新列


如何使用Oracle实现这一点?

以下是一些测试数据:

SQL> select * from MACAddresses
  2  /

  COMPUTER MACADDRESS
---------- ------------
       100 123456789abc
       200 acef35dd6ecc

SQL>
添加新列非常简单:

SQL> alter table MACAddresses
  2      add corrected_MACAddress varchar2(17)
  3  /

Table altered.

SQL>
请注意,此时不能将其设置为非NULL,因为表中已有一些记录。因此,如果要应用这样的约束,需要首先填充它

这是更新新列的最简单方法

SQL> update MACAddresses
  2      set corrected_MACAddress = substr(macaddress, 1,2)||':'||
  3                                 substr(macaddress, 3,2)||':'||
  4                                 substr(macaddress, 5,2)||':'||
  5                                 substr(macaddress, 7,2)||':'||
  6                                 substr(macaddress, 9,2)||':'||
  7                                 substr(macaddress, 11,2)
  8  /

2 rows updated.

SQL> select * from MACAddresses
  2  /

  COMPUTER MACADDRESS   CORRECTED_MACADDR
---------- ------------ -----------------
       100 123456789abc 12:34:56:78:9a:bc
       200 acef35dd6ecc ac:ef:35:dd:6e:cc

SQL>
现在,如果你有一个更复杂的模式,或者如果你想在常规的基础上执行这个操作,我建议你花点精力把它变成一个函数,也许同时消除重复

最后,如果您想要强制执行强制约束,您可以:

SQL> alter table MACAddresses
  2       modify corrected_MACAddress not null
  3  /

Table altered.

SQL>

您可以使用“按级别从双连接”技巧进行任意数量的拆分。或者Oracle 10上的一个无法理解的regexp!在11g上,这将是虚拟列的一个很好的候选者,这将确保它始终与主字段一致。