【问题标题】:Select where in multiple pairs - postgresql选择多对中的位置 - postgresql
【发布时间】:2021-11-14 16:58:24
【问题描述】:

我想查找与对列表(多列)匹配的所有行,但我的查询不起作用。如果我只有任一列的列表,但当它们配对时,我会得到结果。

SELECT * FROM table
WHERE (name,age) IN (('john',23),('jane',50),('john',44))

我看到有关使用 EXISTS 的帖子,但我不知道如何转换此查询。

我检查了我的数据库,它应该返回 8 行,但它返回的是一个空表

【问题讨论】:

  • 以文本形式显示带有可执行 SQL 的完整测试用例。假设您的类型有意义,上述 SQL 是正确的。这是一个测试用例:dbfiddle.uk/…
  • 查询正确。你到底有什么问题?
  • 与您的问题无关,但是:Postgres 9.4 是no longer supported,您应该尽快计划升级。

标签: sql postgresql exists postgresql-9.4 where-in


【解决方案1】:

我检查了我的数据库,它应该返回 8 行,但它返回的是一个空表

你的支票错了。查询正在执行您想要的操作。

一种可能性是名称不正确,因为它们有额外的字符——可能是隐藏的。您可以轻松检查这一点。这会返回什么吗?

SELECT *
FROM table
WHERE name = 'john';

如果这没有返回任何行并且您认为应该返回,那么您需要找出问题所在。这个条件有效吗?

WHERE name LIKE '%john%'

问题可能是名称开头的空格、隐藏字符或相似字符。

如果第一个查询确实返回行,那么问题可能出在age。这会返回什么吗?

SELECT *
FROM table
WHERE name = 'john' AND age = 23;

age 的问题更为微妙,但一种可能性是浮点表示,其值实际上是 22.9999999997 而不是 23。

【讨论】:

  • 谢谢,这完全是我的疏忽。我有旧版本的 search_path。我的代码有效。您的 cmets 也有助于处理边缘情况。
【解决方案2】:

您应该按照以下说明使用:

SELECT * 
FROM t
WHERE (col1, col2) 
       IN ( VALUES (val1a, val2a), (val1b, val2b)) ;

您的查询将是:-

SELECT * FROM t
WHERE (name, age) IN ( VALUES ('john',23),('jane',50),('john',44));

【讨论】:

  • 不需要VALUES 子句(name,age) IN (('john',23),('jane',50),('john',44)) 是完全有效的SQL
  • 同意,这两个表达式都有效。 (姓名,年龄) IN ( 值 ('john',23),('jane',50),('john',44)); & (姓名,年龄) IN ( ('john',23),('jane',50),('john',44));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 2014-12-24
  • 2022-01-24
  • 2021-08-09
  • 1970-01-01
相关资源
最近更新 更多