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

[
  {数字: 7, 信: 'T'},
  {数字: 2, 信: 'R'},
  {数字: 4, 信: 'T'}
]

还有一张有列的桌子

  • 数字

根据我的Collection ,我想从Postgres中的一个表中删除所有与both the 信 and the 数字匹配的行.

IN查询似乎是这项工作的工具,但我如何才能让它适用于tuples匹配?

(在这种情况下,我称这对(数字, 信)tuple)

推荐答案

好吧,我到处搜索都没有找到答案,也许是因为我用了错误的术语搜索.但后来我自己发现了解决办法:

1) Rude solution: turn your values into strings.

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

2) Beautiful solution: just use tuples.

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

Postgresql相关问答推荐

转换失败:(—122.763091,49.04676)转换为地理(位置)""

PostgreSQL:在 select 和 group by 中使用不同的列不会导致错误

PostgreSQL 不删除旧的 WAL 档案

如何使 Postgres 优化引擎具有确定性

Regexp_replace 行为会改变,如果它用空白字符串或 null 替换字符串数组中的字符串

如何包装 record_out() 函数?

Postgresql:创建默认表空间的视图和使用?

Postgres/psycopg2 - 插入字符串数组

使用 pg-promise 插入多条记录

在 postgresql 中将 bool 转换为 int

在 PostgreSQL 中将列数据类型从 Text 更改为 Integer

解释结果中的Recheck Cond是什么意思?

Django:按月查询组

SQLAlchemy 声明式:定义触发器和索引 (Postgres 9)

当从 Heroku pg:pull 数据库时提示:role "root" does not exist.

如何在我的 Mac 上卸载 postgresql(运行 Snow Leopard)

在 postgresql 中对使用 array_agg 创建的文本聚合进行排序

如何使用 PostgreSQL 在任何列中查找所有具有 NULL 值的行

PL/pgSQL 中的 BREAK 语句

PostgreSQL 9.1:如何连接数组中的行而不重复,加入另一个表