如何在 Snowflake 中编写等效的 IF ELSE adhoc sql 查询

Posted

技术标签:

【中文标题】如何在 Snowflake 中编写等效的 IF ELSE adhoc sql 查询【英文标题】:How to write an equivalent IF ELSE adhoc sql query in Snowflake 【发布时间】:2020-10-12 21:25:20 【问题描述】:

我正在尝试创建与以下基于 T-SQL 的即席查询等效的 Snowflake。

**T-SQL version**
Declare @i int = 0;

If(@i = 0)
   PRINT '0';
Else
 Begin
   PRINT '1'
   RETURN;
   PRINT '2'
 End


**Snowflake version**
Set i = 0;

If($i = 0)
   Select '0';
Else
 Begin
   Select '1'
   RETURN;
   Select '2'
 End

当我从 Snowflake Web UI 运行 Snowflake 查询时,我收到错误消息 SQL 编译错误:位置 0 处的语法错误第 1 行意外 'IF'

我搜索了雪花文档,但没有找到有用的文档:

    否则 开始结束 返回

任何帮助将不胜感激。

谢谢。

【问题讨论】:

【参考方案1】:

Snowflake 不支持条件 T-SQL 语句。它在查询中does support conditional expressions。

对于条件语句执行,如果条件表达式的使用不足以满足您的需求,请考虑使用 Snowflake 的 stored procedures with embedded javascript

一个非常简单的存储过程示例,说明调用时执行条件查询:

CREATE OR REPLACE PROCEDURE stored_proc_example(TEST_VALUE INTEGER)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
    // Declaring SQL statement(s) to execute later
    var command_1 = "SELECT 1";
    var command_2 = "SELECT 2";

    if (TEST_VALUE === 0) 

        var stmt = snowflake.createStatement( sqlText: command_1 );
        var rs = stmt.execute();
        // Omitted: Perform logic with 'rs' rows to prepare a return value
        return '1';

     else 

        var stmt = snowflake.createStatement( sqlText: command_2 );
        var rs = stmt.execute();
        // Omitted: Perform logic with 'rs' rows to prepare a return value
        return '2';

    
$$
;

运行方式:

SET i=0;
CALL stored_proc_example($i);

SET i=1;
CALL stored_proc_example($i);

【讨论】:

谢谢柯比。这很有帮助。【参考方案2】:

在 Snowflake 中,您可以为此使用 CASE WHEN 语句。 Here's the documentation.

【讨论】:

试试作为“单级 if-then-else 表达式”的 IFF() 函数怎么样:docs.snowflake.com/en/sql-reference/functions/iff.html 类似:Set i = 1;选择 iff($i = 0, 0, 1); - 虽然我不太确定如何在您的声明中获得 2 值... @MikeDonovan 你的意思是对 OP 发表评论吗?但无论哪种方式,是的,这听起来像是这种情况下的有效选择!

以上是关于如何在 Snowflake 中编写等效的 IF ELSE adhoc sql 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 powerBi 的高级编辑器中编写 Snowflake SELECT 语句查询

如何使用 C# 为 Snowflake 编写 MS 单元测试

等效于 tcl 中的一个衬里用于 if 语句和 puts

Excel 类似于 SNOWFLAKE 中的 AVERAGE FUNCTION

IE 中的 DOMsubtree 修改等效项

Snowflake 程序中 IF 条件下的变量比较