在Vertica中创建变量

6

我正在从SQL Server转移到Vertica。是否有类似的方法来创建变量?

通常我会这样做:

Define @myVariable int
Set @myVariable = select MAX(Field1) from myTable

Vertica基于Postgres,因此我希望Postgres风格的声明可以工作(http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html)。 - Gordon Linoff
@GordonLinoff Vertica是一种面向列的数据库,而PostgreSQL则不是。那么Vertica如何可以“基于”Postgres呢? - mauro
@Mauro . . . Postgres代码的许可证允许开发人员修改代码并重新销售。许多更近期的数据库都是基于Postgres的,例如Greenplum、ParAccel、Netezza、Redshift等。实际上,这不是一个大秘密。Postgres Wiki自豪地宣称了许多派生数据库:https://wiki.postgresql.org/wiki/PostgreSQL_derived_databases。 - Gordon Linoff
@GordonLinoff 确实!这就是他们所说的:“列式数据仓库(由Stonebraker创建)可能只是在分叉psql客户端库。” - mauro
4个回答

5
我认为Vertica不允许使用变量,除非您直接使用vsql,但是vsql变量非常有限,无法做到您期望的那样。
-- this will work
\set a foo
\echo :a
foo

-- this is not what you expect:
\set a NOW()
\echo :a
NOW()

\set a select max(id) from s.items()
\echo :a
selectmax(id)froms.items()

更多信息请参见Vertica文档:https://my.vertica.com/docs/6.1.x/HTML/index.htm#2732.htm

我应该澄清一下:我正在DBeaver中运行我的查询,所以我不能使用这个技巧。也许问题并不一定是Vertica引起的? - ScottieB
1
Vertica本身不允许使用变量,除非通过vsql以非常有限的形式。您可以采用编程或子查询等其他解决方法。 - Guillaume
如果您想在SQL中使用查询,应该将其放在引号和大括号中。例如:\set a '(select max(id) from s.items())' - Vajk Hermecz

2

在Vertica中,你不能像在SQL Server中那样“创建变量”。你试图转换的是T-SQL脚本。

你可以通过创建Perl、Python或Java脚本在数据库之外运行,或者编写一个在Vertica内部运行的C++、R或Java用户定义函数来实现相同的功能。


0

如果您正在使用vsql,您可以创建包含查询结果的变量,尽管它有点复杂:

假设您使用vsql -v INARG=33启动vsql;

SELECT :INARG+1;                -- Set up the query
\pset format u
\pset t                         -- Update output format to bare
\g `echo /tmp/dyneval`          -- Eval the query and write into file
\set DYNARG `cat /tmp/dyneval`  -- Set var from shell command output
\echo :DYNARG

基本上我们将查询结果写入文件,然后将文件内容读入变量中。

您可以使用/tmp/dyneval-${PPID}_id代替/tmp/dyneval,以确保并行执行不会相互影响。(PPID是父进程的进程ID,即vsql进程的PID。)

该解决方案有一些限制:

  • 假设为Linux环境(echo,cat)
  • 它更改了输出格式设置(\pset)

0

在Vertica中,您可以使用:variable_name作为用户输入变量。例如:

select date_time from table_1 where date_time between :start and :end

在上面的代码中,startend是变量。当您运行查询时,会弹出一个对话框提示您输入startend的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接