使用sql将值插入表中

时间:2014-03-23 19:06:42

标签: sql oracle

我正在尝试将日期插入到包含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

2 个答案:

答案 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');

或您需要的任何其他组合。结果将是相同的。