目标:使用给定子查询的结果(具有多行名称的单个列)作为外部选择的选择字段。
目前,我的子查询如下:
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'test_table' AND column_name not in ('colRemove');
我在这个子查询中做的是抓取表中的所有列名(即test_table
)并输出除指定的列名之外的所有列名(即colRemove
)。正如“目标”中所述,我想使用这个子查询:
SELECT (*enter subquery from above here*)
FROM actual_table
WHERE (*enter specific conditions*)
我正在使用版本7.0.4.4的Netezza SQL服务器。理想情况下,我想让整个查询在一行中可执行,但是现在,非常感谢工作解决方案。谢谢!
注意:我不相信已经安装了SQL扩展(即数组),但我需要仔细检查一下。
答案 0 :(得分:0)
一年太晚了,这是我能想到的最好的,但是,正如您已经注意到的,它需要一个存储过程来执行动态SQL。存储过程创建一个视图,其中包含源表中的所有列减去要排除的列。
-- Create test data.
CREATE TABLE test (firstcol INTEGER, secondcol INTEGER, thirdcol INTEGER);
INSERT INTO test (firstcol, secondcol, thirdcol) VALUES (1, 2, 3);
INSERT INTO test (firstcol, secondcol, thirdcol) VALUES (4, 5, 6);
-- Install stored procedure.
CREATE OR REPLACE PROCEDURE CreateLimitedView (varchar(ANY), varchar(ANY)) RETURNS BOOLEAN
LANGUAGE NZPLSQL AS
BEGIN_PROC
DECLARE
tableName ALIAS FOR $1;
columnToExclude ALIAS FOR $2;
colRec RECORD;
cols VARCHAR(2000); -- Adjust as needed.
isfirstcol BOOLEAN;
BEGIN
isfirstcol := true;
FOR colRec IN EXECUTE
'SELECT ATTNAME AS NAME FROM _V_RELATION_COLUMN
WHERE
NAME=UPPER('||quote_literal(tableName)||')
AND ATTNAME <> UPPER('||quote_literal(columnToExclude)||')
ORDER BY ATTNUM'
LOOP
IF isfirstcol THEN
cols := colRec.NAME;
ELSE
cols := cols || ', ' || colRec.NAME;
END IF;
isfirstcol := false;
END LOOP;
-- Should really check if 'LimitedView' already exists as a view, table or synonym.
EXECUTE IMMEDIATE 'CREATE OR REPLACE VIEW LimitedView AS SELECT ' || cols || ' FROM ' || quote_ident(tableName);
RETURN true;
END;
END_PROC
;
-- Run the stored proc to create the view.
CALL CreateLimitedView('test', 'secondcol');
-- Select results from the view.
SELECT * FROM limitedView WHERE firstcol = 4;
FIRSTCOL | THIRDCOL
----------+----------
4 | 6
您可以直接使用存储过程return a resultset但是您无法使用WHERE
子句过滤结果。