我正在从 SQL Server 过渡到 Vertica。有没有类似的方法来创建变量?
通常我会做类似的事情:
Define @myVariable int
Set @myVariable = select MAX(Field1) from myTable
我不认为 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()
有关更多信息,请参阅 https://my.vertica.com/docs/6.1.x/HTML/index.htm#2732.htm上的 vertica 文档
在 Vertica 中“创建变量”的方式与在 SQL Server 中没有“创建变量”的方式相同。您要转换的是 T-SQL 脚本。
您可以在 Vertica 中执行相同的操作,方法是创建在数据库外部运行的 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。)
该解决方案有一些限制:
您可以:variable_name
在 Vertica 中使用用户输入变量。例如:
select date_time from table_1 where date_time between :start and :end
在上面start
和end
是变量。运行查询时,会打开一个对话框,提示您输入 和 的start
值end
。