如果嵌套SELECT返回NULL,如何修改SQL INSERT查询失败

时间:2014-05-27 11:35:54

标签: sql sql-server

我有一组SQL查询,每个查询都是一个插入语句,可以从其他表中获取其值:

insert into table1 values (
        (select tableID from Table1 where Name = 'Name1'),
        (select tableID from Table2 where Name = 'Name2'),
        (select tableID from Table3 where Name = 'Name3')
)

如果select语句无法在表中找到值(即,如果表1中没有' Name1'),那么该字段将变为NULL。

除了将表设计更改为不允许NULL之外,如果嵌套的select语句无法找到指定的值,是否有一种方法可以将我的SQL修改为失败而不是插入NULL? / p>

5 个答案:

答案 0 :(得分:2)

我要做的是最初将值存储在变量中:

DECLARE @tableID1 INT = (SELECT tableID FROM Table1 WHERE Name = 'Name1') 

然后你可以做一个

IF @tableID1 IS NOT NULL AND @tableID2 IS NOT NULL...
    INSERT...

或者INSERT INTO table1 SELECT @tableID1 WHERE @tableID1 IS NOT NULL

如果由于某种原因你想在一个混乱的声明中做到这一点,你可以这样做:

INSERT INTO table1 
    (select tableID from Table1 where Name = 'Name1'),
    (select tableID from Table2 where Name = 'Name2'),
    (select tableID from Table3 where Name = 'Name3')
WHERE EXISTS (select 1 from Table1 where Name = 'Name1'),
  AND EXISTS (select 1 from Table2 where Name = 'Name2'),
  AND EXISTS (select 1 from Table3 where Name = 'Name3')

答案 1 :(得分:0)

有点啰嗦,但这项工作应该很快。

IF OBJECT_ID('tempdb..##table1') IS NOT NULL
    DROP TABLE ##table1

insert into ##table1 values (
    (select tableID from Table1 where Name = 'Name1'),
    (select tableID from Table2 where Name = 'Name2'),
    (select tableID from Table3 where Name = 'Name3')
)

insert into table1
SELECT * FROM ##table1
where tableID is not null

你也可以插入它然后,

DELETE FROM table1 where tableID is null

答案 2 :(得分:0)

使用更新声明

尝试做

Update Table table_name set id = (select if(Name = NULL, NULL, tableID) from Table1 where Name = 'Name1')

答案 3 :(得分:0)

请尝试使用内置的sql函数来检查内部查询是否返回null。例如

insert into table1 values (
    IFNULL((select tableID from Table1 where Name = 'Name1'),""),
    IFNULL((select tableID from Table2 where Name = 'Name2'),"")
)

答案 4 :(得分:0)

您正在寻找的构造是insert . . . select。这允许您在查询上放置where子句。因为您的子查询必须返回一行,所以您可以执行cross join,它最多会返回一行:

insert into table1(id1, id2, id3)
    select t1.tableID, t2.tableId, t3.tableId
    from (select tableID from Table1 where Name = 'Name1') t1 cross join
         (select tableID from Table2 where Name = 'Name2') t2 cross join
         (select tableID from Table3 where Name = 'Name3') t3
    where  t1.tableID is not null and t2.tableId is not null and t3.tableId is not null;

我的猜测是where子句是不必要的。在您的情况下,NULL可能不是表id的值,但表示没有找到行。 <* 1}}在没有行的表上没有返回任何行,因此不会插入任何行。