0

何百もの列を持つテーブルがあります。すべての列 (1 つを除く) の結果を取得して配列に入れ、残りの結果を戻す必要があります。ここでは、テーブルは次のようになります。

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;

それで全部です。PostgreSQL 9.1 以降が必要です
left()right()古いバージョンの場合:

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

説明

textPostgres では、複合型と行型を含むすべての型をキャストできます。そう

  1. 行全体を にキャストしtextます。
  2. 囲んでいる括弧と最初の列を削除します - この場合は長さで識別されます。
  3. 結果を で配列に変換しstring_to_array()ます。
于 2013-05-21T20:50:31.680 に答える
0

一時テーブル、Shema 情報、および実行時 SQL を確認することをお勧めします。以下のコードからいくつかのアイデアが得られる可能性があります... (コードは SQL サーバーの方言で行われます。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 に答える