【问题标题】:"NOT IN" subquery with a leading wildcard带有前导通配符的“NOT IN”子查询
【发布时间】:2014-05-12 17:43:18
【问题描述】:

我有两张桌子:

tablefoo 包含一列 fulldata
tablebar 包含一列partialdata

我想查找在tablebar.partialdata 中没有部分匹配的tablefoo.fulldata 列表。

下面提供了tablefoo.fulldata 的列表,在tablebar 中有部分匹配,但我想要这个的否定。

select fulldata from tablefoo
where fulldata like any (select '%' || partialdata from tablebar); 

这列出了partialdata 中的每条记录:

select fulldata from tablefoow
where partialdata not in (select '%' || partialdata from tablebar);

知道如何仅获取不包含与前导通配符tablebar.partialdata 匹配的结果tablefoo.fulldata

我找到了这个链接:PostgreSQL 'NOT IN' and subquery,它似乎走在了正确的道路上,但我没有让它与通配符一起使用。

当然,我可以编写一个脚本将其从 psql 中提取出来并进行比较,但是将这一切作为查询的一部分来处理会更好。

【问题讨论】:

  • 您的 Postgres 版本、表定义 (\d tblin psql) 和示例数据将按顺序排列。理想情况下是一个测试用例,例如在 sqlfiddle.com 上。
  • Postgres 版本是 9.1。我将考虑向 sqlfiddle.com 添加一个示例。感谢您的建议。

标签: sql postgresql subquery wildcard


【解决方案1】:
SELECT fulldata
FROM   tablefoo f
WHERE  NOT EXISTS (
   SELECT 1
   FROM   tablebar b
   WHERE  f.fulldata LIKE ('%' || b.partialdata)
   );

【讨论】:

  • @thatguy:我看到 kordirko 已经发布了相同的内容,但在您声称它不起作用后将其删除。好吧,它应该工作。或者问题在某种程度上是错误的。
  • 我很沮丧它被删除了,因为我希望将它用作 cmets 的起点。我正在处理我的数据,以确保没有什么东西会绊倒一切。感谢您的答复。我过会儿再回帖。
  • 不是你。是我。我第四次取消它时它起作用了。感谢 kordirko 的原始答案和 Erwin 指出我没有很好地利用原始答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 2012-01-17
相关资源
最近更新 更多