【问题标题】:Snowflake case statement is returning an error instead of the value specified within the ELSE clauseSnowflake case 语句返回错误而不是 ELSE 子句中指定的值
【发布时间】: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


【解决方案1】:

试试这个:

  • 用整行构造一个对象。
  • 测试构造的对象是否有“ID”的数据。
create or replace temp table maybe_id
as 
select 1 x, 2 id;

select *, 
case 
   when object_construct(a.*):ID is not null
   then '1'
   else ''
end as id 
from maybe_id a
;

对我有用 - 当列 id 有数据时它给出1,当列不存在于表中时给出 ``。

【讨论】:

  • id为1的时候合并怎么办?
  • 我们可以在里面做一个insert into 语句吗?
  • 您可以使用相同的代码返回 id 值——我刚刚修复了问题中的代码,您可以使用object_construct(a.*):ID::number 在它存在时为您提供它的值(并转换为数字如果是一个)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 2012-07-07
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多