postgreSQL minus/except 命令模拟仅在插入时用于列



减号/EXCEPT 命令或代码解决方法模拟是否仅存在于列中?由于 MINUS/EXCEPT 命令对行很好,那么对于列呢?

掩码表(物理存在(:

id       col1 col2 col3 col4 ... colN comment
doesn't   A    B    C    D   ...  Z   --alphabet correct sequence
matter

列 列 数据类型 col[i] 彼此相等。

传入的选择流(不是物理表,但表示为表,这是从其他表进行其他复杂联接选择的结果(:

col1 col2 col3 col4 ... colN comment
A    B    C    D   ...  Z   --alphabet correct seq
A    C    B    D   ...  Z   --incorrect
E    B    C    M   ...  Z   --incorrect
... 
Z    Y    X    W   ...  A   --full inverse icorrect

处理掩码表以选择流作为插入结果后,预期输出到物理表:

id      col1  col2  col3  col4 ... colN
(auto-
gnrtd)
(null)(null)(null)(null)...(null)
(null)  C     B   (null)...(null)
E   (null)(null)  M   ...(null)
...
Z     Y     X     W   ...  A

请注意:字母表仅作为示例。不是这里的问题案例。需要 SQL-Logic/命令。减号/除外的类似物,但对于列(不同?如何,如果传入的选择流是其他复杂联接选择的结果(

此任务的 SQL 代码是什么?请指教。

另一种没有 CASE 语句的方法:

设置

CREATE TABLE mask (
col1 TEXT,
col2 TEXT,
col3 TEXT,
col4 TEXT,
col5 TEXT
);
INSERT INTO mask SELECT 'A', 'B', 'C', 'D', 'E';
CREATE TABLE your_stream (
col1 TEXT,
col2 TEXT,
col3 TEXT,
col4 TEXT,
col5 TEXT
);
INSERT INTO your_stream
VALUES
('A', 'B', 'C', 'D', 'E'),
('A', 'C', 'B', 'D', 'E'),
('E', 'B', 'C', 'M', 'E');

查询

SELECT
NULLIF(s.col1, m.col1) AS col1,
NULLIF(s.col2, m.col2) AS col2,
NULLIF(s.col3, m.col3) AS col3,
NULLIF(s.col4, m.col4) AS col4,
NULLIF(s.col5, m.col5) AS col5
FROM your_stream s
CROSS JOIN mask m;

结果

| col1 | col2 | col3 | col4 | col5 |
| ---- | ---- | ---- | ---- | ---- |
| null | null | null | null | null |
| null | C    | B    | null | null |
| E    | null | null | M    | null |

在DB Fiddle上查看

我看不出与像EXCEPT这样的集合操作的联系是什么。

无论如何,这是您可以继续的方式:

INSERT INTO destination (col1, col2, col3, ...)
SELECT CASE WHEN incoming_col1 <> mask.col1
THEN incoming_col1
END,
CASE WHEN incoming_col2 <> mask.col2
THEN incoming_col2
END,
...
FROM mask;

最新更新