簡體   English   中英

使用INTERSECT和UNNEST的sqlalchemy

[英]sqlalchemy using INTERSECT and UNNEST

我正在嘗試將原始SQL轉換為sqlalchemy core / orm,但遇到了一些困難。 這是SQL:

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[];

以下查詢為我提供了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

如何告訴select不包含FROM子句? 請注意func.unnest()僅接受一列。 所以我不能使用func.unnest('my_array_column')

在子查詢中引用封閉查詢的表是關聯過程,SQLAlchemy會嘗試自動執行此過程。 我相信,在這種情況下,它不太有效,因為您的INTERSECT查詢是“可選的”而不是標量值,SQLAlchemy試圖將其放入FROM列表而不是SELECT列表中。

解決方案是雙重的。 我們需要使SQLAlchemy通過應用labelINTERSECT查詢放入SELECT列表中,並使其正確關聯MyTable

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM