如果值不存在,则从其他列插入 id 或 NULL

Posted

技术标签:

【中文标题】如果值不存在,则从其他列插入 id 或 NULL【英文标题】:INSERT id from other column or NULL if value does not exist 【发布时间】:2017-03-01 12:26:26 【问题描述】:

数据

我有一组数据,格式如下:

CAR_MAKE TABLE
ID      MAKE
1       Ford
2       Tesla
3       Acura
4       Honda
5       Toyota


MAKE_NOTES TABLE
NOTE_ID MAKE_ID MAKE_NAME   NOTE
1       1       Ford        New QNX-Based Sync System
2       2       Tesla       Looking forward to Model 3
3       5       Toyota      Updated Corolla 2018
4       Null    Ferrari     Very Fast and Very Red

我知道表 1 和表 2 之间存在重复数据 (make_name)。假设我不能弄乱数据。我也不能保证会先在 car_make 中创建条目。在这种情况下,make_notes.make_id 应该为 null。

到目前为止我做了什么

我要做的是在make_notes中插入一行,如果它在car_make中不存在,则将null插入make_id,否则插入car_make.id。

如果 make_name 存在于 car_make 中,这可以正常工作...但是如果我尝试插入一条带有在 car_make 中不存在的 make_name 的记录,则不会插入任何记录(也不会引发错误)。

INSERT INTO make_notes (
    make_id,
    make_name,
    note
)
SELECT
    id,
    'ford',
    'New Note'
FROM car_make
WHERE make = 'ford';

我也尝试将其用作子查询:

SELECT
    CASE
        WHEN (SELECT EXISTS (SELECT 1 FROM car_make where make = 'Ferrari') = 1)
        THEN car_make.id
        ELSE null
    END AS make_id
FROM car_make;

我一直没有将它集成到我的主查询中而不会引发错误。作为独立查询,它为 car_make 中的每个条目返回一行,如果 'Ferrari' 不存在则返回 null,如果存在则返回每个 id。

问题

如何创建一个插入查询,该查询将插入到“make_notes”中,如果 make_name 在 car_make 中不存在则插入“null”,如果 make_name 存在则插入 car_make.id?

【问题讨论】:

【参考方案1】:

我认为使用IF() 子句应该适用于您的情况:

INSERT INTO `make_notes` (
    make_id,
    make_name,
    note
)
VALUES(
    IF(
        ((SELECT COUNT(*) FROM `car_make` WHERE `make` = 'ford') > 0),
        (SELECT `id` FROM `car_make` WHERE `make` = 'ford'),
        NULL
    ),
    'ford',
    'New note'
);

【讨论】:

【参考方案2】:

我认为你不能通过一个查询来做到这一点。我认为您必须运行 select 才能从 car_make 表中获取 ID。然后进行插入。

【讨论】:

以上是关于如果值不存在,则从其他列插入 id 或 NULL的主要内容,如果未能解决你的问题,请参考以下文章

如果值不存在,将值插入 MySQL 表?

MySQL:如果值存在,则对行进行更新,如果值不存在,则插入 [重复]

如果值不存在,则插入连接表

如果值不存在,则选择空行

如果 pyspark 中不存在,则从数据中选择键列为 null

Oracle SQL:所有行大于值(如果值存在)或所有行小于值(如果值不存在)