将数百列的结果返回到数组中

时间:2013-05-21 13:27:49

标签: sql arrays function postgresql

我有一张数百列的表格。我需要获取每列的结果(除了一列)并将它们放入一个数组中并返回其余的结果。这是表格的样子:

ID          x123     x124    x125    x126  ......
2323343     0        0       0       1
3434566     1        1       1       0
3434342     1        1       0       0 
3366577     0        1       1       1
....        ....     ....    ....    ....

此表继续了一段时间。基本上我需要将所有 x#列的结果带回一个包含其余表结果的数组中(除了ID列)。所以我的结果看起来像是:

array            x123     x124    x125    x126  ......
{0,0,0,1,...}    0        0       0       1
{1,1,1,0,...}    1        1       1       0
{1,1,0,0,...}    1        1       0       0 
{0,1,1,1,...}    0        1       1       1
....             ....     ....    ....    ....

我当前的SQL语句是这样的:

select * from mffcu.crosstab_183

我认为这将采用某种功能来构建具有这些结果的表,这很好。我真的不知道从哪里开始获取每一列,并且每条记录都被抛入一个数组,而不是每一列都有NAMING(有这么多)。任何正确方向的摆动都会有很大的帮助。

3 个答案:

答案 0 :(得分:2)

如果您的表格格式看起来那么简单和严格(第一列包含7位数字),您可以使用一个非常简单的技巧

SELECT string_to_array(right(left(t::text, -1), -9), ',')
FROM   mffcu.crosstab_183 t;

就是这样 left() and right()需要PostgreSQL 9.1或更高版本。 对于旧版本:

SELECT string_to_array(substring(rtrim(t::text, ')'), 10), ',')
FROM   mffcu.crosstab_183 t;

解释

每个类型都可以强制转换为Postgres中的text,包括复合类型和行类型。所以

  1. 将整行投放到text
  2. 删除括号和第一列 - 在这种情况下由长度标识。
  3. 使用string_to_array()将结果转换为数组。

答案 1 :(得分:0)

我认为您需要选择all,然后将结果数组的每一行中的第一个字段设置为该行中剩余结果的数组。它不漂亮,但它有效。

据我所知,无法从select语句中排除列。您需要SELECT *或将每个列命名为包含。

如何完成此操作取决于您用于处理从SELECT返回的数据的编程语言。

答案 2 :(得分:0)

我建议查看临时表,shema信息和运行时sql 下面的代码可能会给你一些想法...(代码是用sql server方言完成的。对postgree来说可能有些调整。)

CREATE TABLE #Result(Id int, ColumnId VARCHAR(10), Value TINYINT);

DECLARE db_cursor CURSOR FOR  
SELECT 'INSERT INTO #Result SELECT ID, ''' + COLUMN_NAME +''', '+ COLUMN_NAME + ' FROM ManyColumnsTable' --' 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'ManyColumnsTable' AND COLUMN_NAME LIKE 'x%'

DECLARE @command NVARCHAR(80)

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @command  

WHILE @@FETCH_STATUS = 0   
BEGIN   
       PRINT @command

       EXECUTE sp_executesql @command 

       FETCH NEXT FROM db_cursor INTO @command   
END   

CLOSE db_cursor   
DEALLOCATE db_cursor

SELECT * FROM #Result --WHERE ColumnId = 'x102'

DROP TABLE #Result