Web應用程序可以發送到的功能的array of arrays
像傳遞數組作爲參數的數組的函數
[
[
[1,2],
[3,4]
],
[
[],
[4,5,6]
]
]
外陣列長度是n > 0
。中間數組的長度是恆定的,在這個例子中是2。內部陣列長度爲n >= 0
。
我可以串建立這樣的:
with t(a, b) as (
values (1, 4), (2, 3), (1, 4), (7, 3), (7, 4)
)
select distinct a, b
from t
where
(a = any(array[1,2]) or array_length(array[1,2],1) is null)
and
(b = any(array[3,4]) or array_length(array[3,4],1) is null)
or
(a = any(array[]::int[]) or array_length(array[]::int[],1) is null)
and
(b = any(array[4,5,6]) or array_length(array[4,5,6],1) is null)
;
a | b
---+---
7 | 4
1 | 4
2 | 3
但我認爲我可以做的更好這樣
with t(a, b) as (
values (1, 4), (2, 3), (1, 4), (7, 3), (7, 4)
), u as (
select unnest(a)::text[] as a
from (values
(
array[
'{"{1,2}", "{3,4}"}',
'{"{}", "{4,5,6}"}'
]::text[]
)
) s(a)
), s as (
select a[1]::int[] as a1, a[2]::int[] as a2
from u
)
select distinct a, b
from
t
inner join
s on
(a = any(a1) or array_length(a1, 1) is null)
and
(b = any(a2) or array_length(a2, 1) is null)
;
a | b
---+---
7 | 4
2 | 3
1 | 4
注意到一個text array
傳遞,然後「鑄造」裏面的功能。這是必要的,因爲Postgresql只能處理匹配維度的數組,並且傳遞的內部數組可以在維度上變化。在傳遞之前,我可以通過添加一些特殊的值(如零)來「修復」它們,使其長度與最長的一樣長,但我認爲在函數內部處理它更清晰。
我錯過了什麼嗎?這是最好的方法嗎?
是以給定的文本格式包裹的三維數組的格式,還是您可以選擇如何傳遞這些值?而接收這些值的函數是plpgsql? Postgres版本? –
@Erwin我可以選擇如何傳遞值。前端是Python,非常靈活。這種格式就是我如何管理它的工作。該函數現在在SQL中用於簡化,但可以是plpgsql或plpython。 Postgresql 9.3。 –