Sql 插入其他表中的数据时插入列的默认值

Sql 插入其他表中的数据时插入列的默认值,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,当我通过从表2中选择数据将数据插入表1时,我面临一个问题 像 插入到表1中 从表2中选择* 所以在这两个表中都有一列,如field1,其值在表2中为null。 但在表中,我为field1设置了默认值 执行后, INSERT INTO table1 SELECT * FROM table2 字段1的值为空,而不是我设置的默认值。您可以指定列名,然后在Select语句中设置值 INSERT INTO table1 (field1, field2, field3, ...) SELEC

当我通过从表2中选择数据将数据插入表1时,我面临一个问题 像

插入到表1中
从表2中选择*

所以在这两个表中都有一列,如field1,其值在表2中为null。 但在表中,我为field1设置了默认值 执行后,

  INSERT INTO table1
     SELECT * FROM table2

字段1的值为空,而不是我设置的默认值。

您可以指定列名,然后在Select语句中设置值

INSERT INTO table1 (field1, field2, field3, ...)
SELECT field1, 
       CASE WHEN field2 IS NOT NULL THEN field2
            ELSE 'Your_default_value' END , 
       field3, ...
FROM table2

您只需跳过您想要使用默认值的列,它将自动填充默认值。

有趣的是,实现这一点的一种方法是使用大小写表达式,假设
field2
是您想要放置默认值的列

INSERT INTO TableName1 (field1, field2, field3, ...)
SELECT field1, CASE WHEN field2 IS NULL THEN 'DefaultValue' ELSE field2 END, field3, ...
FROM TableName2

尝试使用NVL

插入表名1(字段1、字段2、字段3等)

选择字段1,NVL(字段2,'您的默认值'),字段3。。。 例如,从TableName2开始:

INSERT INTO DESTINATION_TABLE(A, B, C, D, E, F)
   SELECT W, X, Y, 'Some custom value', CASE WHEN Z IS NULL THEN 'Some other value' ELSE Z
FROM SOURCE_TABLE
WHERE ....

任何时候要替换空值,请使用COALESCE。COALESCE在Oracle和SQL Server中都可用,除非需要,否则它不会计算参数(NVL总是计算第二个参数),并且它比case语句更简单:

Insert into table1(field1, field2)
  select field1, coalesce(field2, field3, field4, 'novalue') from table2;

NVL和COALESCE之间的一大区别是,如果第二个参数有副作用,您可能会得到不同的结果。

对于某些行,它是空的,而对于其他行,它是字段1的值,因此我想对于空值,它应该设置默认值。我认为您的查询将使用字段1的默认值设置所有记录。作为一个补充,您应该避免在不明确列出列的情况下构建插入,因为这样做很容易表重新构造后中断感谢您的时间和解决方案,为什么我需要提及所有列名?为什么它不通过执行“插入到表1中,从表2中选择*。你知道吗?数据库怎么知道你漏掉了什么?第一列,最后一列,中间的S.T?只有当所有内容都匹配时,不带列名的insert才有效-如果不匹配,您需要通过列出列来指定映射。感谢它的工作,真的感谢您,但是如果我已经在表级别设置了默认值,为什么简单查询不起作用。因为您正在尝试在相应的列中插入null值,当您不在相应列中插入任何内容时,只会插入默认值。
Insert into table1(field1, field2)
  select field1, coalesce(field2, field3, field4, 'novalue') from table2;