如何在 DataGrip(Exasol 方言)上的 SQL 查询中使用变量?

Posted

技术标签:

【中文标题】如何在 DataGrip(Exasol 方言)上的 SQL 查询中使用变量?【英文标题】:How to use variables in SQL queries on DataGrip (Exasol dialect)? 【发布时间】:2021-07-20 13:56:50 【问题描述】:

数据库:EXASOL

IDE:IntelliJ DataGrip

我试图在 SQL 中声明变量并在整个查询过程中调用它们。 这是 Microsoft SQL Server 中的等价物:

DECLARE @var AS INT = 3
SELECT @var AS var
-- Use case example:
SELECT * FROM table1 WHERE column_value = @var

这在 DataGrip 和 Exasol 中是否可行?我搜索了 Exasol 的文档(General Script Language、Database Interaction),其中描述了以下内容:

a = 3
SELECT :a

但是,这会打开一个控制台,要求我输入a 的值。我不想在每次执行代码时都输入变量的值。我想设置一个变量并在查询的不同部分使用它,就像任何其他高级编程语言一样。

我在 JetBrains 的论坛(1、2)上发现了两个类似的问题,但没有得到解答。在 *** (url) 上发现的另一个人刚刚表示 DataGrips 不支持该方言。

有谁知道如何解决这个问题?它根本不支持吗?这确实会提高我和我的团队的工作效率。

提前谢谢你!

【问题讨论】:

据我所知,是数据库本身的限制:***.com/questions/53959257/… 【参考方案1】:

花了一些时间后,我发现这是不可能的。相反,Exasol 允许 LUA 脚本运行此类计算。您将在下面找到一个示例:

CREATE LUA SCRIPT "TEST" (p_country) RETURNS TABLE AS
local param_c = p_country
exit(
    query(
        [[
            SELECT * FROM SCHEMA_NAME.TABLE_NAME
            WHERE SK_COUNTRY = :local_c;
        ]]
        ,local_c=param_c
        )
    );
/

EXECUTE SCRIPT SCHEMA_NAME.TEST('DE');

在此示例中,关键字RETURNS TABLE 输出此查询的表结果。关键字exit() 类似于print() 方法。最后,我不知道为什么,但是函数参数需要分配给一个局部变量,然后需要将其分配给查询中的另一个变量。这对我来说毫无意义,但我无法让它工作。

在我的示例中,我将脚本参数 p_country 分配给本地参数 param_c,然后将其分配给查询参数 local_c

您可以在以下位置找到文档:

    https://docs.exasol.com/database_concepts/scripting/general_script_language.htm?Highlight=for%20loop https://docs.exasol.com/database_concepts/scripting/db_interaction.htm

【讨论】:

以上是关于如何在 DataGrip(Exasol 方言)上的 SQL 查询中使用变量?的主要内容,如果未能解决你的问题,请参考以下文章

DataGrip 无法识别 PostgreSQL 数据类型

Exasol UPSERT 不使用第二张桌子?

通过 DataGrip 上的 ssh 隧道更快地连接

在 DataGrip 中过滤对象

Hash_md5() 在 Exasol 中合并时不起作用

Clojure快餐教程-运行在JVM上的Lisp方言