2016-11-01 18 views
2

raw SQLをsqlalchemy core/ormに変換しようとしていますが、いくつかの問題があります。 、INTERSECTとUNNESTを使用したsqlalchemy

SELECT 
    (SELECT UNNEST(MyTable.my_array_column) 
    INTERSECT 
    SELECT UNNEST(ARRAY['VAL1', 'VAL2']::varchar[])) AS matched 
FROM 
    MyTable 
WHERE 
    my_array_column && ARRAY['VAL1', 'VAL2']::varchar[]; 

次のクエリで私が私のネストされたSELECTには必要ありませんFROM句を与える:ここではSQLです

私は FROMを含まないように selectを伝えることができますどのように
matched = select([func.unnest(MyTable.my_array_column)]).intersect(select([func.unnest('VAL1', 'VAL2')])) 

# SELECT unnest(MyTable.my_array_colum) AS unnest_1 
# FROM MyTable INTERSECT SELECT unnest(%(unnest_3)s, %(unnest_4)s) AS unnest_2 

句? func.unnest()は列のみを受け入れることに注意してください。だから私はfunc.unnest('my_array_column')を使うことはできません。

答えて

2

サブクエリ内の囲むクエリのテーブルを参照すると、correlationのプロセスがSQLAlchemyによって自動的に実行されます。この場合、それはあなたのINTERSECTクエリがSELECTリストの代わりにFROMリストに入れようとするスカラー値ではなく、 "選択可能"なので、これはうまくいきません。

解決策は2倍です。

select([ 
    select([func.unnest(MyTable.my_array_column)]).correlate(MyTable) 
    .intersect(select([func.unnest('VAL1', 'VAL2')])) 
    .label("matched") 
]).select_from(MyTable) 

# SELECT (SELECT unnest("MyTable".my_array_column) AS unnest_1 INTERSECT SELECT unnest(%(unnest_3)s, %(unnest_4)s) AS unnest_2) AS matched 
# FROM "MyTable" 
+0

素晴らしい:私たちはlabelを適用することにより、SQLAlchemyのはSELECTリストにINTERSECTクエリを入れて作り、それが正しくMyTableを関連付けるようにする必要があります。ありがとうございました。 – norbertpy

関連する問題