nzsql - 在字符串中使用定义的变量
nzsql - Using a defined variable inside of a string
在使用 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';
当您想在 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)
您可以将变量的内容嵌入到字符串中。诀窍是创建一个新变量(下例中的 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
中会话变量的更多信息,包括将变量用作 table 和列名称的一部分,请参阅 。
在使用 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';
当您想在 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)
您可以将变量的内容嵌入到字符串中。诀窍是创建一个新变量(下例中的 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
中会话变量的更多信息,包括将变量用作 table 和列名称的一部分,请参阅