在CASE语句中使用INSERT INTO时出错

时间:2019-05-09 21:42:22

标签: sql database oracle

我试图在CASE语句内的表中插入值,但是在INSERT INTO中遇到错误“缺少表达式”的错误。

INSERT INTO中使用CASE的正确方法是什么?您可以在下面找到代码。我在过程中使用此SELECT语句,并将其结果放入游标中。

SELECT
    COALESCE(a.file_type,b.file_type) AS file_type,a.input AS a_input,b.input AS b_input,a.output AS a_output,b.output AS b_output,
    CASE WHEN a.input = b.input THEN
              input_num+1
          WHEN a.input <> b.input THEN
          INSERT INTO diff_values(file_type,a_input,b_input,report_date)
              SELECT file_type,a.input,b.input FROM  test1 a, tset2 b WHERE 
              a.file_type=b.file_type
        WHEN a.output = b.output THEN 
              out_num+1
    END CASE
FROM
  test1 a, tset2 b
         WHERE a.file_type=b.file_type
         AND a.report_date=b.report_date;

1 个答案:

答案 0 :(得分:1)

  • 您不能在SQL查询中嵌入DML语句(例如INSERT)。

  • 您不能在SQL查询中嵌入CASE 语句(PL / SQL)。您可以 在SQL查询中嵌入CASE 表达式,但是该表达式只能计算结果,不能包含PL / SQL(请参见上面的#1)*。

您似乎想要实现的结果是从两个表(test1tset2)中查询一些数据,评估一个表达式,然后将结果插入与新记录相同的表中。由于您的最终结果是一个INSERT,因此您应从此开始,然后创建一个查询,以收集所需的数据,例如:

INSERT INTO diff_values(file_type,a_input,b_input,report_date)
SELECT a.file_type,
       a.input,
       b.input,
       a.report_date
FROM test1 a, tset2 b
WHERE a.file_type=b.file_type
AND a.report_date=b.report_date
AND a.input <> b.input;

请注意,由于WHERE子句保证a.file_type和b.file_type都相同,因此我删除了COALESCE,因此您可以仅引用其中一列。

现在,您的原始声明也包括以下几行:

WHEN a.input = b.input THEN
     input_num+1
...
WHEN a.output = b.output THEN
      out_num+1

我不知道这些应该做什么,但是我想您可以编写其他查询来检测这些情况并输出结果。