我正在从SQL Server转移到Vertica。是否有类似的方法来创建变量?
通常我会这样做:
Define @myVariable int
Set @myVariable = select MAX(Field1) from myTable
我正在从SQL Server转移到Vertica。是否有类似的方法来创建变量?
通常我会这样做:
Define @myVariable int
Set @myVariable = select MAX(Field1) from myTable
-- 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()
\set a '(select max(id) from s.items())'
- Vajk Hermecz在Vertica中,你不能像在SQL Server中那样“创建变量”。你试图转换的是T-SQL脚本。
你可以通过创建Perl、Python或Java脚本在数据库之外运行,或者编写一个在Vertica内部运行的C++、R或Java用户定义函数来实现相同的功能。
如果您正在使用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。)
该解决方案有一些限制:
在Vertica中,您可以使用:variable_name
作为用户输入变量。例如:
select date_time from table_1 where date_time between :start and :end
在上面的代码中,start
和end
是变量。当您运行查询时,会弹出一个对话框提示您输入start
和end
的值。