nzsql - 将子查询转换为另一个选择的列

时间:2014-07-31 18:35:38

标签: sql subquery netezza

目标:使用给定子查询的结果(具有多行名称的单个列)作为外部选择的选择字段。

目前,我的子查询如下:

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扩展(即数组),但我需要仔细检查一下。

1 个答案:

答案 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子句过滤结果。