nzsql - 在字符串中使用定义的变量

Posted

技术标签:

【中文标题】nzsql - 在字符串中使用定义的变量【英文标题】:nzsql - Using a defined variable inside of a string 【发布时间】:2015-01-27 18:43:06 【问题描述】:

在使用 internal variables 时,我在使用 Netezza 的 nzsql 工具时遇到了一些问题。文档中提到了如何设置这些变量,\set varname value,但没有明确说明如何以任何有意义的方式使用它们。

我已经确定它们可以在查询中使用,但到目前为止我只能将它们用作标识符,而不是字符串。

例如,这很好用:

DB.INST1(INST1)=> \set COLNAME 'table_name'

DB.INST1(INST1)=> SELECT :COLNAME FROM _v_sys_columns LIMIT 1;
         TABLE_NAME
----------------------------
 _V_TABLE_ONLY_STORAGE_STAT
(1 row)

DB.INST1(INST1)=> \p
SELECT table_name FROM _v_sys_columns LIMIT 1;

但这不是:

DB.INST1(INST1)=> \set TABLE_NAME 'table_to_search_for'

DB.INST1(INST1)=> SELECT owner, createdate FROM _v_table WHERE tablename = :TABLE_NAME;
ERROR:  Attribute 'TABLE_TO_SEARCH_FOR' not found

DB.INST1(INST1)=> \p
SELECT owner, createdate FROM _v_table WHERE tablename = table_to_search_for;

这也不是(它使用:TABLE_NAME 作为文本文字,而不是它的内容):

DB.INST1(INST1)=> \set TABLE_NAME 'table_to_search_for'

DB.INST1(INST1)=> SELECT owner, createdate FROM _v_table WHERE tablename = ':TABLE_NAME';
 OWNER | CREATEDATE
-------+------------
(0 rows)

DB.INST1(INST1)=> \p
SELECT owner, createdate FROM _v_table WHERE tablename = ':TABLE_NAME';

有什么方法可以完成我希望做的事情吗?我希望达到的结果是让 nzsql 运行以下查询:

SELECT owner, createdate FROM _v_table WHERE tablename = 'table_to_search_for';

【问题讨论】:

【参考方案1】:

如果您想在 nzsql 中将变量的内容用作文字,则需要在设置变量时在文字文本周围包含一组额外的单引号,并用反斜杠转义。

TESTDB.ADMIN(ADMIN)=> \set tvar '\'BLAH\''
TESTDB.ADMIN(ADMIN)=> select :tvar col_alias;
 COL_ALIAS
-----------
 BLAH
(1 row)

使用与您的情况更相关的示例来更新此内容。

TESTDB.ADMIN(ADMIN)=> create table var_table (col1 bigint);
CREATE TABLE
TESTDB.ADMIN(ADMIN)=> \set TABLE_NAME '\'VAR_TABLE\''
TESTDB.ADMIN(ADMIN)=> SELECT owner, createdate FROM _v_table WHERE tablename = :TABLE_NAME; 
 OWNER |     CREATEDATE
-------+---------------------
 ADMIN | 2015-01-13 06:52:36
(1 row)

【讨论】:

所以...看起来答案是否定的,您不能在字符串中使用变量。 nzsql 就是不支持。 我认为这在技术上是正确的。您必须将字符串放入变量中,而不是将变量放入字符串中。我意识到我的回答对您的具体问题并没有本来应该的那么有用,所以更新一下。 我花了将近一年的时间,但我终于想出了如何在字符串中嵌入变量。谢谢你的帮助,它把我推向了正确的方向! ***.com/a/34270716/477563【参考方案2】:

可以将变量的内容嵌入到字符串中。诀窍是创建一个新变量(在下面的示例中为quoted_foo),其中包含一个单引号、变量的内容和另一个单引号。

DB.TST(LLAMA)=> SELECT * FROM example_table WHERE example_column LIKE '%ello%';
 EXAMPLE_COLUMN
----------------
 Hello World
(1 row)

DB.TST(LLAMA)=> \set foo ello
DB.TST(LLAMA)=> \set quoted_foo '\'' :foo '\''
DB.TST(LLAMA)=> \echo :quoted_foo
'ello'

DB.TST(LLAMA)=> SELECT * FROM example_table WHERE example_column LIKE '%' || :quoted_foo || '%';
 EXAMPLE_COLUMN
----------------
 Hello World
(1 row)

有关nzsql 中的会话变量的更多信息,包括将变量用作表名和列名的一部分,请参阅this answer。

【讨论】:

以上是关于nzsql - 在字符串中使用定义的变量的主要内容,如果未能解决你的问题,请参考以下文章

netezza nzsql 将查询结果导出到 csv 文件

NZSQL/代码 - Netezza NZ-SQL 中的 LEFT() 函数

在 aginity 中使用 nzsql 命令

NZSQL/CODE - 如何在 Netezza 中使用 PRINT

在 NZSQL 中使用 union all 限制时出错

在 nzsql 中创建日志和错误文件