例如,我有一个具有以下值的集合:
[
{数字: 7, 信: 'T'},
{数字: 2, 信: 'R'},
{数字: 4, 信: 'T'}
]
还有一张有列的桌子
- 数字
- 信
根据我的Collection ,我想从Postgres中的一个表中删除所有与both the 信 and the 数字匹配的行.
IN
查询似乎是这项工作的工具,但我如何才能让它适用于tuples匹配?
(在这种情况下,我称这对(数字, 信)
为tuple)
例如,我有一个具有以下值的集合:
[
{数字: 7, 信: 'T'},
{数字: 2, 信: 'R'},
{数字: 4, 信: 'T'}
]
还有一张有列的桌子
根据我的Collection ,我想从Postgres中的一个表中删除所有与both the 信 and the 数字匹配的行.
IN
查询似乎是这项工作的工具,但我如何才能让它适用于tuples匹配?
(在这种情况下,我称这对(数字, 信)
为tuple)
好吧,我到处搜索都没有找到答案,也许是因为我用了错误的术语搜索.但后来我自己发现了解决办法:
SELECT * FROM (
SELECT *, letter || '-' || number AS tuple FROM table
) WHERE tuple IN ('T-7', 'R-2', 'T-4')
SELECT * FROM table)
WHERE (letter, number) IN (('T', 7), ('R', 2), ('T', 4))
第二个似乎要好得多,可能是(你知道,这个"性能"部分只是浪费时间),但在我愚蠢的基准测试中,它没有显示出性能优势,因为我需要获取一个小表和4个元组.以下是EXPLAIN ANALYSE
个输出(与上述部分的查询不同):
1) Rude:
Seq Scan on test (cost=0.00..3.20 rows=4 width=11) (actual time=0.037..0.156 rows=4 loops=1)
Filter: (((name || '-'::text) || (seq)::text) = ANY ('{maria-17,antônia-33,joana-64,joana-76}'::text[]))
Rows Removed by Filter: 194
Total runtime: 0.183 ms
2) Beautiful:
Seq Scan on test (cost=0.00..3.39 rows=1 width=11) (actual time=0.022..0.077 rows=4 loops=1)
Filter: (((name = 'maria'::text) AND (seq = 17)) OR ((name = 'antônia'::text) AND (seq = 33)) OR ((name = 'joana'::text) AND (seq = 64)) OR ((name = 'joana'::text) AND (seq = 76)))
Rows Removed by Filter: 194
Total runtime: 0.101 ms