0

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

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

我认为这将需要某种功能来构建包含这些结果的表格,这很好。我真的不知道从哪里开始将每一列和每一条记录都放入一个数组中,而无需命名每一列(有这么多)。任何朝着正确方向的摆动都会大有帮助。

4

3 回答 3

2

如果您的表格格式像看起来一样简单和严格(第一列由 7 位数字组成),您可以采用一个非常简单的技巧

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

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

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

解释

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

  1. 将整行投射到text.
  2. 删除括号和第一列 - 在这种情况下由长度标识。
  3. 将结果转换为带有string_to_array().
于 2013-05-21T20:50:31.680 回答
0

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

据我所知,没有办法从 select 语句中排除一列。您需要SELECT *或命名要包含的每一列。

具体如何完成取决于您用于处理从SELECT.

于 2013-05-21T13:35:37.000 回答
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
于 2013-05-21T14:17:42.310 回答