假设我有一个包含以下列的表:
字段1 |场2 | field3 |字段4
我想在此表中插入多行,但field1,field2和field3的值对于每一行都是相同的。只有field4的值会改变。
显然我可以单独插入每一行,但结果查询会有点难看,我想知道是否有一种更有效/更优雅的方法。
我想到了类似的东西:
insert into my_table (field1, field2, field3, field4) values (foo, bar, baz, ('value one','value two','value three','value four'))
结果将是:
field1 | field2 | field3 | field4
foo | bar | baz | value one
foo | bar | baz | value two
foo | bar | baz | value four
foo | bar | baz | value five
实际上,'field4'列是一种字符串类型,当我编写查询时,不同的值是已知的。没有必要从桌子或任何东西中获取它们(尽管如果可能的话,我对能够做到这一点的解决方案感兴趣) 这是可能的还是我必须单独写每个插件?
编辑:我已经将问题更改为更改列的数据类型(一般文本数据)以及数据来自何处。对于那些已经回答没有这些信息的人抱歉。感谢。
答案 0 :(得分:5)
实现此目的的最简单方法是利用connect by
语句的select
子句生成所需数量的合成行。
假设field1
到field3
属于varchar2
数据类型且field4
属于数字数据类型,数据样本和insert
声明你提供了暗示,然后你可以写下面的insert
陈述
Insert into your_table_name(field1, field2, field3, field4)
select 'foo'
, 'bar' /* static string literals */
, 'baz'
, level /* starts at 1 and will be increased by 1 with each iteration */
from dual
connect by level <= 5 /* regulator of number of rows */
结果:
FIELD1 FIELD2 FIELD3 FIELD4
----------- ----------- ----------- ----------
foo bar baz 1
foo bar baz 2
foo bar baz 3
foo bar baz 4
foo bar baz 5
修改强>:
如果您希望将value one
,value two
等字面视为fiedl4
列的值,则可以按如下方式更改上述{{1}}语句:
insert
结果:
Insert into your_table_name(field1, field2, field3, field4)
select 'foo'
, 'bar'
, 'baz'
, concat('value ', to_char(to_date(level, 'J'), 'jsp'))
from dual
connect by level <= 5
如果您想使用绝对随机生成的字符串文字填充 FIELD1 FIELD2 FIELD3 FIELD4
------ ------ ------ -------------
foo bar baz value one
foo bar baz value two
foo bar baz value three
foo bar baz value four
foo bar baz value five
,您可以专门使用field4
包和dbms_random
函数:
string()
结果:
Insert into your_table_name(field1, field2, field3, field4)
select 'foo'
, 'bar'
, 'baz'
, dbms_random.string('l', 7)
from dual
connect by level <= 5
答案 1 :(得分:4)
这是一种方法 - 但可能更简洁,更容易编写多个插入语句:
insert into my_table
select 1,1,1,field
from (select 1 field from dual
union select 2 from dual
union select 3 from dual);
答案 2 :(得分:3)
您可以使用case
语句对Nicholas Krasnov的答案进行修改,以设置字符串值:
insert into my_table(field1, field2, field3, field4)
select 'foo', 'bar', 'baz',
case level
when 1 then 'value one'
when 2 then 'value two'
when 3 then 'value three'
when 4 then 'value four'
end
from dual
connect by level <= 4;
select * from my_table;
FIELD1 FIELD2 FIELD3 FIELD4
------ ------ ------ --------------------
foo bar baz value one
foo bar baz value two
foo bar baz value three
foo bar baz value four
添加更多行/值只需更改level
限制和额外when
子句即可。 (like this)。如果您的号码不匹配,您也可以else
发出警告。顺便提一下,哪个字符串值跟level
值一致没有特别的意义。