我正在尝试将日期插入到包含4列的表中,我首先在2列中插入数据,然后在其余2列中插入数据,但数据插入第2行而不是第1行,我想要这些数据仅限第一排。我们可以通过使用“更新表集....”插入它,但我想以这种方式将数据插入表中。当我们在特定列中插入一个值时,它必须检查它的前一行,如果它是null然后数据应该在前一行中添加(随时填充所有列的行)
我的表=单词(粗俗,诽谤,冒犯,仇恨)作为列
insert into words(vulgar,voilance) values('xxx','kill');
select * from words;
vulgar-voilance-offence-hate
xxx--------kill----------------------
insert into words(offence,hate) values('idiot','snake');
select * from words;
vulga---voilance----offence----hate
xxx---------kill----------------------------
------------------------ idiot---- snake
答案 0 :(得分:0)
据我所知,这在SQL中是不可能的,没有“高级”逻辑来检索具有null的行,并在发现行时进行更新,或者在它执行时插入。
然而,你的问题不再有想象力;如果有多个行带有空值,如果在两列中插入值,但只有一行为空,等等。
我认为你需要重新考虑你的数据模型。
答案 1 :(得分:0)
正如其他人所指出的,这不是您可以拥有的最佳数据模型,因此您可以考虑重新设计。 严格参考技术问题本身,因为您使用的是Oracle,您可以使用PL / SQL来实现这一点,例如(在您的示例中):
create or replace procedure p_insert_2_words(p_offence in varchar2, p_hate in varchar2)
is
begin
update words set offence = p_offence and hate = p_hate
where offence is null and hate is null;
if sql%rowcount = 0
then
insert into words(offence,hate) values(p_offence, p_hate);
end if;
end;
从这一点开始,您可以创建一个更通用的程序,insert
/ update
所有单词:
create or replace procedure p_insert_or_update(p_offence in varchar2 default null, p_hate in varchar2 default null, p_vulgar in varchar2 default null, p_voilance in varchar2 default null)
is
begin
if p_offence is not null
then
update words set offence = p_offence
where offence is null;
if sql%rowcount = 0
then
insert into words(offence) values(p_offence);
end if;
end if;
if p_hate is not null
then
update words set hate = p_hate
where hate is null;
if sql%rowcount = 0
then
insert into words(hate ) values(p_hate);
end if;
end if;
if p_offence is not null
then
update words set offence = p_offence
where offence is null;
if sql%rowcount = 0
then
insert into words(offence) values(p_offence);
end if;
end if;
if p_vulgar is not null
then
update words set voilance = p_voilance
where voilance is null;
if sql%rowcount = 0
then
insert into words(voilance) values(p_voilance);
end if;
end if;
end;
您可以复制粘贴上面的代码然后调用它(必须调用StoredProcedure
):
p_insert_or_update(p_offence => 'idiot', p_hate => 'snake');
p_insert_or_update(p_offence => 'idiot');
p_insert_or_update(p_offence => 'idiot', p_voilance => 'kill');
或您需要的任何其他组合。结果将是相同的。