Stored procedures Informix 12.1如何根据case子句中的条件选择条件

Stored procedures Informix 12.1如何根据case子句中的条件选择条件,stored-procedures,informix,Stored Procedures,Informix,|在以下过程中执行查询: { table1 column1 column2 column3 column4 a a x 1 b b y 4 c c y 4 d c y 4 } CREATE PROCEDURE PROCEDURE1(input1 smallint) insert in

|在以下过程中执行查询:

{
 table1
column1 column2 column3 column4 
a        a       x        1      
b        b       y        4      
c        c       y        4      
d        c       y        4      
}

CREATE PROCEDURE PROCEDURE1(input1 smallint)

insert into table1
select 
  column1,column2,column3,column4
From
 Table1
WHERE
 column1 not in ('a','b') 
AND
 CASE 
  WHEN input1=1 THEN  "column2 in ('a' ,'b')" --lead to syntax error and with quote, i.e. :  "column2 in (a ,b)" lead to boolean expression error  
  WHEN input1=2 THEN  "column3 in ('x' ,'y')" 
  ELSE                 "column4 not in ('1' ,'2')" 
END;
END PROCEDURE;
如果Case子句中的条件字符串与quote一起输入,则会出现此错误:

"Result of a boolean expression is not of boolean type"
如果在Case子句中从条件字符串中删除引号,则会出现语法错误

有人能帮忙吗


(使用PREPARE语句have)

我认为您要做的可能需要:

INSERT INTO Table2
    SELECT column1, column2, column3, column4
      FROM Table1
     WHERE column1 NOT IN ('a', 'b') 
       AND ((input1  = 1 AND column2 IN ('a', 'b')) OR
            (input1  = 2 AND column3 IN ('x', 'y')) OR
            (input1 != 1 AND input1 != 2 AND column4 NOT IN ('1', '2'))
           )
注意,我已经将INSERT的目标表更改为
Table2
;没有理由在选择数据的表中插入行-数据已经存在,重复的行只会增加混乱。但是,如果您坚持目标表应该与源表相同,并且没有主键来阻止您滥用它,那么您可以使用
INSERT-INTO-Table1选择…FROM-Table1…
,这有点出乎我的意料(Informix 12.10.FC6已测试)

您可以将其改写为:

INSERT INTO Table2
    SELECT column1, column2, column3, column4
      FROM Table1
     WHERE column1 NOT IN ('a', 'b') 
       AND ((input1     IN (1)    AND column2     IN ('a', 'b')) OR
            (input1     IN (2)    AND column3     IN ('x', 'y')) OR
            (input1 NOT IN (1, 2) AND column4 NOT IN ('1', '2'))
           )
这强调了OR'd术语主要组成部分的相似性和差异性

由此组装MCVE(-或MRE或现在使用的任何名称)或SSCCE()会产生:

DROP TABLE IF EXISTS Table1;
DROP TABLE IF EXISTS Table2;
DROP PROCEDURE IF EXISTS procedure1;

CREATE TEMP TABLE Table1
(
    column1 CHAR(1) NOT NULL,
    column2 CHAR(1) NOT NULL,
    column3 CHAR(1) NOT NULL,
    column4 CHAR(1) NOT NULL
);

INSERT INTO Table1 VALUES('a', 'a', 'x', '1');
INSERT INTO Table1 VALUES('b', 'b', 'y', '4');
INSERT INTO Table1 VALUES('c', 'c', 'y', '4');
INSERT INTO Table1 VALUES('d', 'c', 'y', '4');

CREATE TEMP TABLE Table2
(
    column1 CHAR(1) NOT NULL,
    column2 CHAR(1) NOT NULL,
    column3 CHAR(1) NOT NULL,
    column4 CHAR(1) NOT NULL
);

CREATE PROCEDURE procedure1(input1 SMALLINT)

    INSERT INTO Table2
        SELECT column1, column2, column3, column4
          FROM Table1
         WHERE column1 NOT IN ('a', 'b') 
           AND ((input1  = 1 AND column2 IN ('a', 'b')) OR
                (input1  = 2 AND column3 IN ('x', 'y')) OR
                (input1 != 1 AND input1 != 2 AND column4 NOT IN ('1', '2'))
               );

    INSERT INTO Table2
        SELECT column1, column2, column3, column4
          FROM Table1
         WHERE column1 NOT IN ('a', 'b') 
           AND ((input1     IN (1)    AND column2     IN ('a', 'b')) OR
                (input1     IN (2)    AND column3     IN ('x', 'y')) OR
                (input1 NOT IN (1, 2) AND column4 NOT IN ('1', '2'))
               );

END PROCEDURE;

EXECUTE PROCEDURE procedure1(1);
SELECT * FROM Table2;
DELETE FROM Table2;

EXECUTE PROCEDURE procedure1(2);
SELECT * FROM Table2;
DELETE FROM Table2;

EXECUTE PROCEDURE procedure1(3);
SELECT * FROM Table2;
使用我的程序(与微软的同名johnny come Latesty程序无关,且比该程序更老),我得到:

+如果存在表1,则删除表;
+如果存在表2,则删除表;
+如果存在程序1,则删除程序;
+创建临时表表1
(
第1列字符(1)不为空,
第2列字符(1)不为空,
第3列字符(1)不为空,
第4列字符(1)不为空
);
+在表1中插入值(“a”、“a”、“x”、“1”);
+在表1中插入值(“b”、“b”、“y”、“4”);
+在表1中插入值(“c”、“c”、“y”、“4”);
+在表1中插入值('d','c','y','4');
+创建临时表表2
(
第1列字符(1)不为空,
第2列字符(1)不为空,
第3列字符(1)不为空,
第4列字符(1)不为空
);
+创建过程过程1(input1 SMALLINT)
插入表2中
选择第1列、第2列、第3列和第4列
来自表1
其中第1列不在('a','b')中
和((input1=1和('a','b')中的第2列)或
(输入1=2,第3列位于('x','y'))或
(input1!=1和input1!=2,第4列不在('1','2')中)
);
插入表2中
选择第1列、第2列、第3列和第4列
来自表1
其中第1列不在('a','b')中
和((在(1)中输入1,在('a','b')中输入第2列)或
(在(2)中输入1,在('x','y')中输入第3列)或
(输入1不在(1,2)中,第4列不在('1','2'))
);
结束程序;
+执行程序1(1);
+从表2中选择*;
+从表2中删除;
+执行程序1(2);
+从表2中选择*;
c | c | y | 4
d | c | y | 4
c | c | y | 4
d | c | y | 4
+从表2中删除;
+执行程序1(3);
+从表2中选择*;
c | c | y | 4
d | c | y | 4
c | c | y | 4
d | c | y | 4
因为有两个INSERT语句,所以表2应该包含插入的每一行的两个副本。当然,表应该有一个主键,以防止这种滥用关系理论的行为

你也应该考虑在没有提到<代码>输入1>代码>的情况下,单独写这3个操作是否更好:< /P>

CREATE PROCEDURE procedure2(input1 SMALLINT)

    IF input1 = 1 THEN
        INSERT INTO Table2
            SELECT column1, column2, column3, column4
              FROM Table1
             WHERE column1 NOT IN ('a', 'b') 
               AND column2     IN ('a', 'b');
    ELIF input1 = 2 THEN
        INSERT INTO Table2
            SELECT column1, column2, column3, column4
              FROM Table1
             WHERE column1 NOT IN ('a', 'b') 
               AND column3     IN ('x', 'y');
    ELSE
        INSERT INTO Table2
            SELECT column1, column2, column3, column4
              FROM Table1
             WHERE column1 NOT IN ('a', 'b') 
               AND column4 NOT IN ('1', '2');
    END IF;

END PROCEDURE;

你也可以考虑使用视图,甚至是CTE(公共表表达式)特征,如果你的查询是巨大的。

请解释地球上的“条件短语PAR2 {1,2,3}”。也许你可以举一个例子来说明这些值是什么——创建MCVE(-或MRE或现在使用的任何名称)的一部分。如果试图使用字符串来表示部分查询,则应在存储过程中使用PREPARE语句及其相关语句。请看,您已编辑,但它不是MCVE。首先,它不在CREATEPROCEDURE语句中。没有说明什么是
输入
条件_psrt1
条件_部分21
条件_部分22
条件_部分23
。但是,除非
input1
Table1
中是一个数字列,而其他都是
Table1
中布尔列的名称,否则您会遇到严重问题(语法错误)@JonathanLeffler:我纠正了again@JonathanLeffler:无法使用prepare,因为查询太大,无法出错,并且没有指定行号。无论如何,谢谢你的感谢!