[英]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通過應用label
將INTERSECT
查詢放入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.