SQL MINUS / EXCEPT命令模拟仅在插入时用于列

时间:2019-10-09 08:54:59

标签: sql postgresql

MINUS / 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

将mask-table处理为select-stream作为插入结果后,预期输出到物理表:

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 /命令。类似于MINUS / EXCEPT,但用于列(DISTINCT?如何,如果输入的选择流是其他复杂的联合选择的结果,怎么办)

此任务的SQL代码是什么?请提出建议。

2 个答案:

答案 0 :(得分:1)

没有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 |

View on DB Fiddle

答案 1 :(得分:0)

我看不到与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;