如何从元组列表中选择与多列匹配的行?

fia*_*jaf 10 sql postgresql

例如,我有一个具有以下值的集合:

[
  {number: 7, letter: 'T'},
  {number: 2, letter: 'R'},
  {number: 4, letter: 'T'}
]
Run Code Online (Sandbox Code Playgroud)

和一个包含列的表

  • 信件

根据我的收藏,我想SELECT从Postgres的一张桌子中找到所有符合字母和数字的行.

IN查询似乎是工作的工具,但如何使之成为工作的元组匹配?

(我打电话对(number, letter)一个元组在这种情况下)

fia*_*jaf 15

好吧,我到处搜索,没有找到答案,也许是因为我用错误的条款搜索.但后来我发现了解决方案:

1)粗鲁的解决方案:将您的值转换为字符串.

SELECT * FROM (
  SELECT *, letter || '-' || number AS tuple FROM table
) WHERE tuple IN ('T-7', 'R-2', 'T-4')
Run Code Online (Sandbox Code Playgroud)

2)美丽的解决方案:只使用元组.

SELECT * FROM table)
WHERE (letter, number) IN (('T', 7), ('R', 2), ('T', 4))
Run Code Online (Sandbox Code Playgroud)

性能

第二个似乎好多了,可能是(这个"性能"部分只是浪费时间,你知道),但它在我的愚蠢基准测试中没有表现出性能优势,只有一个小表和4个元组来获取.EXPLAIN ANALYSE输出如下(不是上述部分的相同查询):

1)粗鲁:

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
Run Code Online (Sandbox Code Playgroud)

2)美丽:

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
Run Code Online (Sandbox Code Playgroud)