【发布时间】:2021-03-08 14:48:04
【问题描述】:
我需要检查表中是否已经存在一个或多个字段,以便使用它们执行merge into 语句。
我试过了:
select sat_sector_hkey,
CASE
WHEN EXISTS(select id from hub_sector)
THEN (MERGE INTO ...)
END AS id
from sat_sector;
为了测试,我只使用了一个case 语句,并将merge into 替换为THEN...ELSE 值:
SELECT sat_sector_hkey,
CASE
WHEN EXISTS(select id from hub_sector)
THEN '1'
ELSE ''
END AS id
FROM sat_sector;
当该字段不存在时,查询返回错误而不是'':
SQL 编译错误:位置 23 处的错误第 3 行无效标识符 “身份证”
我使用的是CASE,因为我需要检查一列是否存在,因为我们的数据来自多个来源,因此我不知道它是否存在。
【问题讨论】:
-
错误是说
id无法识别。使用正确的列名。 -
这是@GordonLinoff 的问题,我正在使用
case,因为该字段可能不存在,由于我每次进入雪花阶段都会收到动态结构,所以我正在做case子句在一些可能不存在的字段上。 -
不能在 CASE 表达式中执行 MERGE 之类的 sql 语句。 CASE 表达式用于返回标量值。
-
我认为您最好的选择是使用 Information_Schema.Columns 来获取列的可用性。您可能正在查看基于 Information_Schema.Columns 的具有一些条件执行的存储过程。
-
@Error_2646 所说的 id 正确。这需要一个存储的 Proc 来检查 information_schema。您不能使用 case 语句来检查列是否存在。您可以使用它来检查列是否包含 NULL,但如果这就是您的意思吗?
标签: sql merge case snowflake-cloud-data-platform