In 谓词

IN谓词将一个或多个值与一组值进行比较。

阅读语法图跳过可视化语法图expression1NOTIN( fullselect1)(,expression2)行值表达式NOTIN( fullselect2)

expression1 被指定时,IN谓词会将一个值与一组值进行比较。 当 fullselect1 被指定时,fullselect必须返回一个结果列,并且可以返回任意数量的值,无论是否为空。 以及结果列的数据类型 expression1 以及结果列的数据类型 fullselect1expression2 必须兼容。 如果表达式是一个单一的主变量,则该主变量可以标识一个结构。 任何指定的宿主变量或结构都必须根据宿主结构和变量的声明规则在应用程序中进行描述。

当指定行值表达式时,IN 谓词将值与值集合进行比较。 结果表的 fullselect2 的结果表必须与行值表达式的列数相同。 行值表达式中每个表达式的数据类型及其对应结果列的数据类型 fullselect2 必须兼容。 行值表达式中每个表达式的值与 fullselect2。 谓词的值取决于指定的操作符:

  • 当操作员为IN时,谓词的结果为:
    • 如果至少有一行从 fullselect2 等于行值表达式
    • 如果 fullselect2 为空,或者没有一行从 fullselect2 等于行值表达式
    • 否则,未知(也就是说,如果行值表达式与从 fullselect2 ,则行值表达式与从 fullselect2 且没有一行等于行值表达式)。 fullselect2 等于行值表达式 )。
  • 当操作员不在时,谓词的结果为:

    如果的结果为空,或者行值表达式不等于任何一行返回的行,则返回真。 fullselect2 为空,或者行值表达式不等于 fullselect2

    如果行值表达式等于 fullselect2 返回的至少一行,则为假。

    否则,未知(也就是说,如果行值表达式与从 fullselect2 计算结果为未知,因为从 fullselect2 ,并且行值表达式与返回的行比较 fullselect2 对于任何由 fullselect2 )。

IN谓词与量化谓词等效,如下所示:
表 1. 在谓语和等价量化的谓语中
In 谓词 等价量化谓词
expression1 IN (expression2) expression1 = expression2
expression IN (fullselect1) expression = ANY (fullselect1)
expression NOT IN (fullselect1) expression <> ALL (fullselect1)
expression1 IN (expressiona, 
   expressionb, ...)
expression1 IN ( SELECT * FROM R)
当T是一个单行的表,R是由以下全选操作生成的结果表:
  SELECT value1 FROM T
    UNION
  SELECT value2 FROM T
    UNION
      .
      .
      .
    UNION
  SELECT valuen FROM T
row-value-expression IN (fullselect2) row-value-expression = SOME (fullselect2)
row-value-expression IN (fullselect2) row-value-expression = ANY (fullselect2)
row-value-expression NOT IN (fullselect2) row-value-expression <> ALL (fullselect2)

如果IN谓词的运算数具有不同的数据类型或属性,则用于确定IN谓词评估数据类型的规则与UNION、EXCEPT和INTERSECT的规则相同。 描述见结果数据类型规则

如果 IN 谓词的运算数是具有不同 CCSID 的字符串,则用于确定转换哪些运算数的规则是用于组合字符串的操作的规则。 参见字符串比较

示例

示例 1
对于任何员工在部门 D11、 B01 或 C01 的行,以下谓词均成立。
  WORKDEPT IN ('D11', 'B01', 'C01')
示例 2
对于任何员工在部门 E11 工作的行,以下谓词为真。
  EMPNO IN (SELECT EMPNO FROM DSN8C10.EMP
    WHERE WORKDEPT = 'E11')
示例 3
如果一个项目的预计开始日期(PRENDATE)在两年之内,则以下谓词为真。
  YEAR(PRENDATE)  IN (YEAR(CURRENT DATE),
                      YEAR(CURRENT DATE + 1 YEAR),
                      YEAR(CURRENT DATE + 2 YEARS))
示例 4
以下示例获取 DSN8C10.EMP 中员工的电话号码,其中员工编号(EMPNO)是下面定义的 COBOL 结构中的指定值。
  77 PHNUM  PIC X(6).
  01 EMPNO-STRUCTURE.
     05 CHAR-ELEMENT-1  PIC X(6) VALUE '000140'.
     05 CHAR-ELEMENT-2  PIC X(6) VALUE '000340'.
     05 CHAR-ELEMENT-3  PIC X(6) VALUE '000220'.
     .
     .
     .
  EXEC SQL DECLARE PHCURS CURSOR FOR
       SELECT PHONENO FROM DSN8C10.EMP
         WHERE EMPNO IN 
         (:EMPNO-STRUCTURE.CHAR-ELEMENT-1,
          :EMPNO-STRUCTURE.CHAR-ELEMENT-2,
          :EMPNO-STRUCTURE.CHAR-ELEMENT-3)
  END-EXEC.
  EXEC SQL OPEN PHCURS
  END-EXEC.
  EXEC SQL FETCH PHCURS INTO :PHNUM
  END-EXEC.