假设我有一个包含以下列的表:
场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'))
Run Code Online (Sandbox Code Playgroud)
结果将是:
field1 | field2 | field3 | field4
foo | bar | baz | value one
foo | bar | baz | value two
foo | bar | baz | value four
foo | bar | baz | value five
Run Code Online (Sandbox Code Playgroud)
实际上,'field4'列是一种字符串类型,当我编写查询时,不同的值是已知的.没有必要从表或任何东西中获取它们(尽管如果可能的话,我对可以做到的解决方案感兴趣)这是可行的还是我必须单独编写每个插入?
编辑:我已经更改了问题,以更清楚地更改列的数据类型(一般文本数据)以及数据来自何处.对于那些已经回答没有这些信息的人抱歉.
谢谢.
实现此目的的最简单方法是利用语句的connect by
子句select
生成所需数量的合成行.
假设field1
到field3
是varchar2
数据类型和field4
是Number数据类型,数据的样本,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 */
Run Code Online (Sandbox Code Playgroud)
结果:
FIELD1 FIELD2 FIELD3 FIELD4
----------- ----------- ----------- ----------
foo bar baz 1
foo bar baz 2
foo bar baz 3
foo bar baz 4
foo bar baz 5
Run Code Online (Sandbox Code Playgroud)
编辑:
如果您希望逐字地查看value one
,value two
等等作为fiedl4
列的值,您可以更改上述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
Run Code Online (Sandbox Code Playgroud)
结果:
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
Run Code Online (Sandbox Code Playgroud)
如果要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
Run Code Online (Sandbox Code Playgroud)
结果:
FIELD1 FIELD2 FIELD3 FIELD4
------ ------ ------ --------
foo bar baz dbtcenz
foo bar baz njykkdy
foo bar baz bcvgabo
foo bar baz ghxcavn
foo bar baz solhgmm
Run Code Online (Sandbox Code Playgroud)
这是一种方法——但可能更干净、更容易编写多个插入语句:
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);
Run Code Online (Sandbox Code Playgroud)
您可以使用 Nicholas Krasnov 答案的变体和语句case
来设置字符串值:
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
Run Code Online (Sandbox Code Playgroud)
添加更多行/值只需要更改限制level
和额外的when
子句即可匹配。(像这样)。else
如果您发现数字不匹配,您还可能会收到警告。顺便说一句,哪个字符串值与哪个值对应没有特殊意义level
。
归档时间: |
|
查看次数: |
15355 次 |
最近记录: |