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

IF 语句

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

条件分支是所有语言的基本特性。过程语言支持 IF 语句。

方言中存在不同风格的 IF 语句,包括

  • 对于分支体需要一个 THEN 子句,在这种情况下,对于多语句体不需要 BEGIN .. END 块
  • 允许使用专用的 ELSIF 子句来进行替代的、嵌套的分支,以避免嵌套。这主要是一个语法糖特性。

在 jOOQ 中,一个 IF 语句可能如下所示

-- PL/SQL syntax
IF i = 0 THEN
  INSERT INTO a (col) VALUES (1);
ELSIF i = 1 THEN
  INSERT INTO b (col) VALUES (2);
ELSE
  INSERT INTO c (col) VALUES (3);
END IF;
// All dialects
if_(i.eq(0)).then(
  insertInto(A).columns(A.COL).values(1)
).elsif(i.eq(1)).then(
  insertInto(B).columns(B.COL).values(2)
).else_(
  insertInto(C).columns(C.COL).values(3)
)

请注意,ifelse 都是 Java 语言中的保留关键字,因此 jOOQ API 不能将它们用作方法名称。 我们在这些冲突的名称后面加上了下划线:if_()else_()

方言支持

此示例使用 jOOQ

if_(i.eq(0)).then(deleteFrom(BOOK)).else_(deleteFrom(AUTHOR))

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

Aurora Postgres, CockroachDB, DB2, Exasol, HSQLDB, Hana, Informix, MariaDB, MySQL, Oracle, Postgres, Trino, YugabyteDB

IF i = 0 THEN
  DELETE FROM BOOK;
ELSE
  DELETE FROM AUTHOR;
END IF

BigQuery

IF i = 0 THEN
  DELETE FROM BOOK
  WHERE TRUE;
ELSE
  DELETE FROM AUTHOR
  WHERE TRUE;
END IF

Firebird

IF (:i = 0) THEN
  DELETE FROM BOOK;
ELSE
  DELETE FROM AUTHOR;

H2

if (i = 0) {
  try (PreparedStatement s = c.prepareStatement(
    "DELETE FROM BOOK"
  )) {
    s.execute();
  }
} else {
  try (PreparedStatement s = c.prepareStatement(
    "DELETE FROM AUTHOR"
  )) {
    s.execute();
  }
}

Snowflake

IF (:i = 0) THEN
  DELETE FROM BOOK;
ELSE
  DELETE FROM AUTHOR;
END IF

SQLDataWarehouse, SQLServer

IF @i = 0
  DELETE FROM BOOK;
ELSE
  DELETE FROM AUTHOR;

ASE, Access, Aurora MySQL, ClickHouse, Databricks, Derby, DuckDB, MemSQL, Redshift, SQLite, Sybase, Teradata, Vertica

/* UNSUPPORTED */
使用 jOOQ 3.21 生成。早期 jOOQ 版本的支持可能有所不同。 在我们的网站上翻译您自己的 SQL

反馈

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

The jOOQ Logo