Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PL/Sql IF循环具有多个OR-IN';s_Sql_Oracle_Plsql - Fatal编程技术网

PL/Sql IF循环具有多个OR-IN';s

PL/Sql IF循环具有多个OR-IN';s,sql,oracle,plsql,Sql,Oracle,Plsql,我有一个pl/sql循环,如下所示: IF A IN (1,2,3,4,5) OR B IN (1,2,3,4,5) OR C IN (1,2,3,4,5) THEN --Do Something-- ELSIF A IN (6,7) AND B IN (6,7) AND C IN (6,7) THEN --Do Something Else-- ELSE --Do Nothing-- END IF; 有没有更好的方法来编写上述循环 以上示例仅供参考。我的原始程序在IF循

我有一个pl/sql循环,如下所示:

IF A IN (1,2,3,4,5) OR B IN (1,2,3,4,5) OR C IN (1,2,3,4,5) 
THEN
   --Do Something--
ELSIF A IN (6,7) AND B IN (6,7) AND C IN (6,7) 
THEN
   --Do Something Else--
ELSE
   --Do Nothing--
END IF;
有没有更好的方法来编写上述循环

以上示例仅供参考。我的原始程序在IF循环中包含了更多的条件

请帮助我优化它。我没有主意了


谢谢。

试试
CASE
语句。它将比
IF
语句更具可读性。

尝试
案例
语句。它将比
IF
语句更具可读性。

创建一个(嵌套表)类型来保存值和测试条件,然后您可以使用操作来比较它们:

  • (a MULTISET INTERSECT DISTINCT b)不是空的
    相当于
    语句;及
  • (除DISTINCT b外的多集)为空
    相当于
    语句
为了便于测试,我将代码包装在一个函数中:

Oracle 11g R2架构设置

CREATE OR REPLACE TYPE Number_Table_Type AS TABLE OF NUMBER
/

CREATE OR REPLACE FUNCTION Test_Multiple_Values (
  A IN NUMBER,
  B IN NUMBER,
  C IN NUMBER,
  D IN NUMBER,
  E IN NUMBER,
  F IN NUMBER,
  G IN NUMBER,
  H IN NUMBER
) RETURN NUMBER
AS
  inputs Number_Table_Type := Number_Table_Type( A, B, C, D, E, F, G, H );
BEGIN
  IF ( inputs MULTISET INTERSECT DISTINCT Number_Table_Type( 1, 2, 3, 4, 5 ) ) IS NOT EMPTY THEN
     RETURN 1;
  ELSIF ( inputs MULTISET EXCEPT DISTINCT Number_Table_Type( 6, 7 ) ) IS EMPTY THEN
     RETURN 2;
  ELSE
     RETURN 3;
  END IF;
END;
/
WITH inputs AS (
  SELECT 1 AS A, 2 AS B, 3 AS C, 4 AS D, 5 AS E, 6 AS F, 7 AS G, 8 AS H FROM DUAL
  UNION ALL
  SELECT 6, 7, 6, 7, 6, 7, 6, 7 FROM DUAL
  UNION ALL
  SELECT 8, 9, 10, 11, 12, 13, 14, 15 FROM DUAL
)
SELECT A, B, C, D, E, F, G, H, Test_Multiple_Values( A, B, C, D, E, F, G, H ) FROM inputs
| A | B |  C |  D |  E |  F |  G |  H | TEST_MULTIPLE_VALUES(A,B,C,D,E,F,G,H) |
|---|---|----|----|----|----|----|----|---------------------------------------|
| 1 | 2 |  3 |  4 |  5 |  6 |  7 |  8 |                                     1 |
| 6 | 7 |  6 |  7 |  6 |  7 |  6 |  7 |                                     2 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |                                     3 |
查询1

CREATE OR REPLACE TYPE Number_Table_Type AS TABLE OF NUMBER
/

CREATE OR REPLACE FUNCTION Test_Multiple_Values (
  A IN NUMBER,
  B IN NUMBER,
  C IN NUMBER,
  D IN NUMBER,
  E IN NUMBER,
  F IN NUMBER,
  G IN NUMBER,
  H IN NUMBER
) RETURN NUMBER
AS
  inputs Number_Table_Type := Number_Table_Type( A, B, C, D, E, F, G, H );
BEGIN
  IF ( inputs MULTISET INTERSECT DISTINCT Number_Table_Type( 1, 2, 3, 4, 5 ) ) IS NOT EMPTY THEN
     RETURN 1;
  ELSIF ( inputs MULTISET EXCEPT DISTINCT Number_Table_Type( 6, 7 ) ) IS EMPTY THEN
     RETURN 2;
  ELSE
     RETURN 3;
  END IF;
END;
/
WITH inputs AS (
  SELECT 1 AS A, 2 AS B, 3 AS C, 4 AS D, 5 AS E, 6 AS F, 7 AS G, 8 AS H FROM DUAL
  UNION ALL
  SELECT 6, 7, 6, 7, 6, 7, 6, 7 FROM DUAL
  UNION ALL
  SELECT 8, 9, 10, 11, 12, 13, 14, 15 FROM DUAL
)
SELECT A, B, C, D, E, F, G, H, Test_Multiple_Values( A, B, C, D, E, F, G, H ) FROM inputs
| A | B |  C |  D |  E |  F |  G |  H | TEST_MULTIPLE_VALUES(A,B,C,D,E,F,G,H) |
|---|---|----|----|----|----|----|----|---------------------------------------|
| 1 | 2 |  3 |  4 |  5 |  6 |  7 |  8 |                                     1 |
| 6 | 7 |  6 |  7 |  6 |  7 |  6 |  7 |                                     2 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |                                     3 |

CREATE OR REPLACE TYPE Number_Table_Type AS TABLE OF NUMBER
/

CREATE OR REPLACE FUNCTION Test_Multiple_Values (
  A IN NUMBER,
  B IN NUMBER,
  C IN NUMBER,
  D IN NUMBER,
  E IN NUMBER,
  F IN NUMBER,
  G IN NUMBER,
  H IN NUMBER
) RETURN NUMBER
AS
  inputs Number_Table_Type := Number_Table_Type( A, B, C, D, E, F, G, H );
BEGIN
  IF ( inputs MULTISET INTERSECT DISTINCT Number_Table_Type( 1, 2, 3, 4, 5 ) ) IS NOT EMPTY THEN
     RETURN 1;
  ELSIF ( inputs MULTISET EXCEPT DISTINCT Number_Table_Type( 6, 7 ) ) IS EMPTY THEN
     RETURN 2;
  ELSE
     RETURN 3;
  END IF;
END;
/
WITH inputs AS (
  SELECT 1 AS A, 2 AS B, 3 AS C, 4 AS D, 5 AS E, 6 AS F, 7 AS G, 8 AS H FROM DUAL
  UNION ALL
  SELECT 6, 7, 6, 7, 6, 7, 6, 7 FROM DUAL
  UNION ALL
  SELECT 8, 9, 10, 11, 12, 13, 14, 15 FROM DUAL
)
SELECT A, B, C, D, E, F, G, H, Test_Multiple_Values( A, B, C, D, E, F, G, H ) FROM inputs
| A | B |  C |  D |  E |  F |  G |  H | TEST_MULTIPLE_VALUES(A,B,C,D,E,F,G,H) |
|---|---|----|----|----|----|----|----|---------------------------------------|
| 1 | 2 |  3 |  4 |  5 |  6 |  7 |  8 |                                     1 |
| 6 | 7 |  6 |  7 |  6 |  7 |  6 |  7 |                                     2 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |                                     3 |
创建(嵌套表)类型以保存值和测试条件,然后可以使用操作来比较它们:

  • (a MULTISET INTERSECT DISTINCT b)不是空的
    相当于
    语句;及
  • (除DISTINCT b外的多集)为空
    相当于
    语句
为了便于测试,我将代码包装在一个函数中:

Oracle 11g R2架构设置

CREATE OR REPLACE TYPE Number_Table_Type AS TABLE OF NUMBER
/

CREATE OR REPLACE FUNCTION Test_Multiple_Values (
  A IN NUMBER,
  B IN NUMBER,
  C IN NUMBER,
  D IN NUMBER,
  E IN NUMBER,
  F IN NUMBER,
  G IN NUMBER,
  H IN NUMBER
) RETURN NUMBER
AS
  inputs Number_Table_Type := Number_Table_Type( A, B, C, D, E, F, G, H );
BEGIN
  IF ( inputs MULTISET INTERSECT DISTINCT Number_Table_Type( 1, 2, 3, 4, 5 ) ) IS NOT EMPTY THEN
     RETURN 1;
  ELSIF ( inputs MULTISET EXCEPT DISTINCT Number_Table_Type( 6, 7 ) ) IS EMPTY THEN
     RETURN 2;
  ELSE
     RETURN 3;
  END IF;
END;
/
WITH inputs AS (
  SELECT 1 AS A, 2 AS B, 3 AS C, 4 AS D, 5 AS E, 6 AS F, 7 AS G, 8 AS H FROM DUAL
  UNION ALL
  SELECT 6, 7, 6, 7, 6, 7, 6, 7 FROM DUAL
  UNION ALL
  SELECT 8, 9, 10, 11, 12, 13, 14, 15 FROM DUAL
)
SELECT A, B, C, D, E, F, G, H, Test_Multiple_Values( A, B, C, D, E, F, G, H ) FROM inputs
| A | B |  C |  D |  E |  F |  G |  H | TEST_MULTIPLE_VALUES(A,B,C,D,E,F,G,H) |
|---|---|----|----|----|----|----|----|---------------------------------------|
| 1 | 2 |  3 |  4 |  5 |  6 |  7 |  8 |                                     1 |
| 6 | 7 |  6 |  7 |  6 |  7 |  6 |  7 |                                     2 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |                                     3 |
查询1

CREATE OR REPLACE TYPE Number_Table_Type AS TABLE OF NUMBER
/

CREATE OR REPLACE FUNCTION Test_Multiple_Values (
  A IN NUMBER,
  B IN NUMBER,
  C IN NUMBER,
  D IN NUMBER,
  E IN NUMBER,
  F IN NUMBER,
  G IN NUMBER,
  H IN NUMBER
) RETURN NUMBER
AS
  inputs Number_Table_Type := Number_Table_Type( A, B, C, D, E, F, G, H );
BEGIN
  IF ( inputs MULTISET INTERSECT DISTINCT Number_Table_Type( 1, 2, 3, 4, 5 ) ) IS NOT EMPTY THEN
     RETURN 1;
  ELSIF ( inputs MULTISET EXCEPT DISTINCT Number_Table_Type( 6, 7 ) ) IS EMPTY THEN
     RETURN 2;
  ELSE
     RETURN 3;
  END IF;
END;
/
WITH inputs AS (
  SELECT 1 AS A, 2 AS B, 3 AS C, 4 AS D, 5 AS E, 6 AS F, 7 AS G, 8 AS H FROM DUAL
  UNION ALL
  SELECT 6, 7, 6, 7, 6, 7, 6, 7 FROM DUAL
  UNION ALL
  SELECT 8, 9, 10, 11, 12, 13, 14, 15 FROM DUAL
)
SELECT A, B, C, D, E, F, G, H, Test_Multiple_Values( A, B, C, D, E, F, G, H ) FROM inputs
| A | B |  C |  D |  E |  F |  G |  H | TEST_MULTIPLE_VALUES(A,B,C,D,E,F,G,H) |
|---|---|----|----|----|----|----|----|---------------------------------------|
| 1 | 2 |  3 |  4 |  5 |  6 |  7 |  8 |                                     1 |
| 6 | 7 |  6 |  7 |  6 |  7 |  6 |  7 |                                     2 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |                                     3 |

CREATE OR REPLACE TYPE Number_Table_Type AS TABLE OF NUMBER
/

CREATE OR REPLACE FUNCTION Test_Multiple_Values (
  A IN NUMBER,
  B IN NUMBER,
  C IN NUMBER,
  D IN NUMBER,
  E IN NUMBER,
  F IN NUMBER,
  G IN NUMBER,
  H IN NUMBER
) RETURN NUMBER
AS
  inputs Number_Table_Type := Number_Table_Type( A, B, C, D, E, F, G, H );
BEGIN
  IF ( inputs MULTISET INTERSECT DISTINCT Number_Table_Type( 1, 2, 3, 4, 5 ) ) IS NOT EMPTY THEN
     RETURN 1;
  ELSIF ( inputs MULTISET EXCEPT DISTINCT Number_Table_Type( 6, 7 ) ) IS EMPTY THEN
     RETURN 2;
  ELSE
     RETURN 3;
  END IF;
END;
/
WITH inputs AS (
  SELECT 1 AS A, 2 AS B, 3 AS C, 4 AS D, 5 AS E, 6 AS F, 7 AS G, 8 AS H FROM DUAL
  UNION ALL
  SELECT 6, 7, 6, 7, 6, 7, 6, 7 FROM DUAL
  UNION ALL
  SELECT 8, 9, 10, 11, 12, 13, 14, 15 FROM DUAL
)
SELECT A, B, C, D, E, F, G, H, Test_Multiple_Values( A, B, C, D, E, F, G, H ) FROM inputs
| A | B |  C |  D |  E |  F |  G |  H | TEST_MULTIPLE_VALUES(A,B,C,D,E,F,G,H) |
|---|---|----|----|----|----|----|----|---------------------------------------|
| 1 | 2 |  3 |  4 |  5 |  6 |  7 |  8 |                                     1 |
| 6 | 7 |  6 |  7 |  6 |  7 |  6 |  7 |                                     2 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |                                     3 |

你说的“有更好的方法”是什么意思?你不喜欢这段代码的什么地方?我们没有关于你要完成什么的上下文。我有8个变量要与14个值进行比较。我只是想知道是否有更好的方法来编写它,因为我当前的循环看起来非常大和破旧。没有
if-loop
…你说“有更好的方法”是什么意思?你不喜欢这段代码的什么地方?我们没有关于你要完成什么的上下文。我有8个变量要与14个值进行比较。我只是想知道是否有更好的方法来编写它,因为我当前的循环看起来非常大和破旧。没有
if-loop
。。。