可用版本: Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

IN谓词

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

在 SQL 中,除了将一个值与多个值进行比较之外,IN 谓词还可以用于创建半连接或反连接。 jOOQ 在 org.jooq.Field 接口上提供了以下方法,用于构造此类 IN 谓词

in(Collection<?>)                   // Construct an IN predicate from a collection of bind values
in(T...)                            // Construct an IN predicate from bind values
in(Field<?>...)                     // Construct an IN predicate from column expressions
in(Select<? extends Record1<T>>)    // Construct an IN predicate from a subselect
notIn(Collection<?>)                // Construct a NOT IN predicate from a collection of bind values
notIn(T...)                         // Construct a NOT IN predicate from bind values
notIn(Field<?>...)                  // Construct a NOT IN predicate from column expressions
notIn(Select<? extends Record1<T>>) // Construct a NOT IN predicate from a subselect

一个 IN 谓词的示例可能如下所示

TITLE     IN ('Animal Farm', '1984')
TITLE NOT IN ('Animal Farm', '1984')
BOOK.TITLE.in("Animal Farm", "1984")
BOOK.TITLE.notIn("Animal Farm", "1984")

NOT IN 和 NULL 值

请注意,您可能不应该在 NOT IN 谓词的右侧有任何 NULL 值,因为整个表达式将评估为 NULL,这很少是期望的结果。 这可以使用以下推理来非正式地显示

-- The following conditional expressions are formally or informally equivalent
A NOT IN (B, C)
A != ANY(B, C)
A != B AND A != C

-- Substitute C for NULL, you'll get
A NOT IN (B, NULL)   -- Substitute C for NULL
A != B AND A != NULL -- From the above rules
A != B AND NULL      -- [ANY] != NULL yields NULL
NULL                 -- [ANY] AND NULL yields NULL

防止这种情况发生的一个好方法是使用 EXISTS 谓词 进行反连接,该谓词对 NULL 值不敏感。 请参阅手册中关于条件表达式的部分,以查看布尔真值表。

方言支持

此示例使用 jOOQ

val("TITLE").in(select(BOOK.TITLE).from(BOOK))

翻译成以下特定方言的表达式

所有方言

'TITLE' IN (
  SELECT BOOK.TITLE
  FROM BOOK
)
使用 jOOQ 3.21 生成。早期 jOOQ 版本的支持可能有所不同。 在我们的网站上翻译您自己的 SQL

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo