WHEN MATCHED AND ..
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
各种方言支持标准 SQL 语法,其中包含多个 WHEN 子句,并且每个子句都提供了额外的 谓词。
它的工作方式类似于 CASE 表达式,其中应用第一个匹配的 CASE。
如果某个方言不支持此语法,则可以通过将各种 WHEN 子句折叠为单个子句来模拟它,该子句使用 CASE 表达式 来涵盖所有条件和结果。
方言支持
此示例使用 jOOQ
mergeInto(AUTHOR)
.using(selectOne())
.on(AUTHOR.LAST_NAME.eq("Hitchcock"))
.whenMatchedAnd(AUTHOR.FIRST_NAME.eq("Mary"))
.thenUpdate().set(AUTHOR.YEAR_OF_BIRTH, 1849)
.whenMatchedAnd(AUTHOR.FIRST_NAME.eq("Alfred"))
.thenUpdate().set(AUTHOR.YEAR_OF_BIRTH, 1899)
翻译成以下特定方言的表达式
Databricks, Snowflake
MERGE INTO AUTHOR USING ( SELECT 1 one ) ON AUTHOR.LAST_NAME = 'Hitchcock' WHEN MATCHED AND AUTHOR.FIRST_NAME = 'Mary' THEN UPDATE SET YEAR_OF_BIRTH = 1849 WHEN MATCHED AND AUTHOR.FIRST_NAME = 'Alfred' THEN UPDATE SET YEAR_OF_BIRTH = 1899
DB2
MERGE INTO AUTHOR USING ( SELECT 1 one FROM SYSIBM.DUAL ) ON AUTHOR.LAST_NAME = 'Hitchcock' WHEN MATCHED AND AUTHOR.FIRST_NAME = 'Mary' THEN UPDATE SET AUTHOR.YEAR_OF_BIRTH = 1849 WHEN MATCHED AND AUTHOR.FIRST_NAME = 'Alfred' THEN UPDATE SET AUTHOR.YEAR_OF_BIRTH = 1899
Derby
MERGE INTO AUTHOR USING ( SELECT 1 one FROM SYSIBM.SYSDUMMY1 ) ON AUTHOR.LAST_NAME = 'Hitchcock' WHEN MATCHED AND AUTHOR.FIRST_NAME = 'Mary' THEN UPDATE SET AUTHOR.YEAR_OF_BIRTH = 1849 WHEN MATCHED AND AUTHOR.FIRST_NAME = 'Alfred' THEN UPDATE SET AUTHOR.YEAR_OF_BIRTH = 1899
Exasol
MERGE INTO AUTHOR
USING (
SELECT 1 one
)
ON AUTHOR.LAST_NAME = 'Hitchcock'
WHEN MATCHED THEN UPDATE SET
AUTHOR.YEAR_OF_BIRTH = CASE
WHEN AUTHOR.FIRST_NAME = 'Mary' THEN 1849
WHEN AUTHOR.FIRST_NAME = 'Alfred' THEN 1899
ELSE AUTHOR.YEAR_OF_BIRTH
END
WHERE (
AUTHOR.FIRST_NAME = 'Mary'
OR AUTHOR.FIRST_NAME = 'Alfred'
)
Firebird
MERGE INTO AUTHOR USING ( SELECT 1 one FROM RDB$DATABASE ) ON AUTHOR.LAST_NAME = 'Hitchcock' WHEN MATCHED AND AUTHOR.FIRST_NAME = 'Mary' THEN UPDATE SET AUTHOR.YEAR_OF_BIRTH = 1849 WHEN MATCHED AND AUTHOR.FIRST_NAME = 'Alfred' THEN UPDATE SET AUTHOR.YEAR_OF_BIRTH = 1899
H2
MERGE INTO AUTHOR USING ( SELECT 1 one ) ON AUTHOR.LAST_NAME = 'Hitchcock' WHEN MATCHED AND AUTHOR.FIRST_NAME = 'Mary' THEN UPDATE SET AUTHOR.YEAR_OF_BIRTH = 1849 WHEN MATCHED AND ( NOT (AUTHOR.FIRST_NAME = 'Mary') AND AUTHOR.FIRST_NAME = 'Alfred' ) THEN UPDATE SET AUTHOR.YEAR_OF_BIRTH = 1899
Hana
MERGE INTO AUTHOR
USING (
SELECT 1 one
FROM SYS.DUMMY
)
ON AUTHOR.LAST_NAME = 'Hitchcock'
WHEN MATCHED AND (
AUTHOR.FIRST_NAME = 'Mary'
OR AUTHOR.FIRST_NAME = 'Alfred'
) THEN UPDATE SET
AUTHOR.YEAR_OF_BIRTH = CASE
WHEN AUTHOR.FIRST_NAME = 'Mary' THEN 1849
WHEN AUTHOR.FIRST_NAME = 'Alfred' THEN 1899
ELSE AUTHOR.YEAR_OF_BIRTH
END
HSQLDB
MERGE INTO AUTHOR
USING (
SELECT 1 one
FROM (VALUES (1)) AS dual (dual)
)
ON AUTHOR.LAST_NAME = 'Hitchcock'
WHEN MATCHED AND (
AUTHOR.FIRST_NAME = 'Mary'
OR (
NOT (AUTHOR.FIRST_NAME = 'Mary')
AND AUTHOR.FIRST_NAME = 'Alfred'
)
) THEN UPDATE SET
AUTHOR.YEAR_OF_BIRTH = CASE
WHEN AUTHOR.FIRST_NAME = 'Mary' THEN 1849
WHEN (
NOT (AUTHOR.FIRST_NAME = 'Mary')
AND NOT (AUTHOR.FIRST_NAME = 'Mary')
AND AUTHOR.FIRST_NAME = 'Alfred'
) THEN 1899
ELSE AUTHOR.YEAR_OF_BIRTH
END
Oracle
MERGE INTO AUTHOR
USING (
SELECT 1 one
)
ON (AUTHOR.LAST_NAME = 'Hitchcock')
WHEN MATCHED THEN UPDATE SET
AUTHOR.YEAR_OF_BIRTH = CASE
WHEN AUTHOR.FIRST_NAME = 'Mary' THEN 1849
WHEN AUTHOR.FIRST_NAME = 'Alfred' THEN 1899
ELSE AUTHOR.YEAR_OF_BIRTH
END
WHERE (
AUTHOR.FIRST_NAME = 'Mary'
OR AUTHOR.FIRST_NAME = 'Alfred'
)
Postgres, Vertica
MERGE INTO AUTHOR
USING (
SELECT 1 one
) AS dummy_30260683("one")
ON AUTHOR.LAST_NAME = 'Hitchcock'
WHEN MATCHED AND AUTHOR.FIRST_NAME = 'Mary' THEN UPDATE SET
YEAR_OF_BIRTH = 1849
WHEN MATCHED AND AUTHOR.FIRST_NAME = 'Alfred' THEN UPDATE SET
YEAR_OF_BIRTH = 1899
Redshift
UPDATE AUTHOR
SET
YEAR_OF_BIRTH = CASE
WHEN AUTHOR.FIRST_NAME = 'Mary' THEN 1849
WHEN AUTHOR.FIRST_NAME = 'Alfred' THEN 1899
ELSE AUTHOR.YEAR_OF_BIRTH
END
FROM (
SELECT 1 one
) alias_30260683
WHERE (
AUTHOR.LAST_NAME = 'Hitchcock'
AND (
AUTHOR.FIRST_NAME = 'Mary'
OR AUTHOR.FIRST_NAME = 'Alfred'
)
)
SQLServer
MERGE INTO AUTHOR
USING (
SELECT 1 one
) AS dummy_30260683([one])
ON AUTHOR.LAST_NAME = 'Hitchcock'
WHEN MATCHED AND (
AUTHOR.FIRST_NAME = 'Mary'
OR (
NOT (AUTHOR.FIRST_NAME = 'Mary')
AND AUTHOR.FIRST_NAME = 'Alfred'
)
) THEN UPDATE SET
AUTHOR.YEAR_OF_BIRTH = CASE
WHEN AUTHOR.FIRST_NAME = 'Mary' THEN 1849
WHEN (
NOT (AUTHOR.FIRST_NAME = 'Mary')
AND NOT (AUTHOR.FIRST_NAME = 'Mary')
AND AUTHOR.FIRST_NAME = 'Alfred'
) THEN 1899
ELSE AUTHOR.YEAR_OF_BIRTH
END;
Sybase
MERGE INTO AUTHOR USING ( SELECT 1 one FROM SYS.DUMMY ) AS dummy_30260683([one]) ON AUTHOR.LAST_NAME = 'Hitchcock' WHEN MATCHED AND AUTHOR.FIRST_NAME = 'Mary' THEN UPDATE SET AUTHOR.YEAR_OF_BIRTH = 1849 WHEN MATCHED AND AUTHOR.FIRST_NAME = 'Alfred' THEN UPDATE SET AUTHOR.YEAR_OF_BIRTH = 1899
Teradata
MERGE INTO AUTHOR
USING (
SELECT 1 one
FROM (
SELECT 1 AS "dual"
) AS "dual"
)
ON AUTHOR.LAST_NAME = 'Hitchcock'
WHEN MATCHED THEN UPDATE SET
YEAR_OF_BIRTH = CASE
WHEN AUTHOR.FIRST_NAME = 'Mary' THEN 1849
WHEN AUTHOR.FIRST_NAME = 'Alfred' THEN 1899
ELSE AUTHOR.YEAR_OF_BIRTH
END
WHERE (
AUTHOR.FIRST_NAME = 'Mary'
OR AUTHOR.FIRST_NAME = 'Alfred'
)
ASE, Access, Aurora MySQL, Aurora Postgres, BigQuery, ClickHouse, CockroachDB, DuckDB, Informix, MariaDB, MemSQL, MySQL, SQLDataWarehouse, SQLite, Trino, YugabyteDB
/* UNSUPPORTED */
使用 jOOQ 3.21 生成。早期 jOOQ 版本的支持可能有所不同。 在我们的网站上翻译您自己的 SQL
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!