【问题标题】:Querying multiple tables for text strings that are similar在多个表中查询相似的文本字符串
【发布时间】:2018-12-24 23:01:43
【问题描述】:

我正在开发一个使用 Postgres 作为数据库的应用程序。我现在需要查询多个表甚至多个数据库中包含的数据。

我仍在学习 PostgreSQL 查询的语法,所以希望这个问题的结构正确。

我想在 2 个表中查询包含在特定列中的文本字符串。 在下面的示例代码中,我尝试在 table_1 和 table_2 中查询水果名称“apple”或类似于“apple”的水果名称,例如“crabapple”。我希望其中一个字符串是松散的,另一个是明确的。

我可以单独查询每个表,但如何交叉引用两个表中的“fruit_name”以了解相似之处?

SELECT * FROM good_fruits where fruit_name ILIKE '%apple%'
SELECT * FROM bad_fruits where fruit_name ILIKE '%apple%'

我尝试使用下面的查询做类似的事情,但它不起作用。
应该如何构造查询以在名为 fruit_name 的单个列中查询两个表中的相似文本?

select 
good_fruits.bar_code,
good_fruits.fruit_name, 
bad_fruits.fruit_name
from good_fruits full outer join bad_fruits
on good_fruits.fruit_name=bad_fruits.fruit_name 
WHERE good_fruits.fruit_name IS NOT NULL 
and bad_fruits.fruit_name IS NOT NULL
and good_fruits.fruit_name ILIKE '%apple%'
and bad_fruits.fruit_name ILIKE '%apple%'

我计划使用带有 psycopg2 模块的 Python 脚本进行此查询。返回的结果应该是:

good_fruits.barcode, good_fruits.fruit_name, bad_fruits.fruit_name

【问题讨论】:

标签: python-3.x postgresql


【解决方案1】:

如果我理解正确,您只需为输出列提供化名:

select 
good_fruits.bar_code as "good_fruits.bar_code",
good_fruits.fruit_name as "good_fruits.fruit_name", 
bad_fruits.fruit_name as "bad_fruits.fruit_name"
from good_fruits full outer join bad_fruits
on good_fruits.fruit_name=bad_fruits.fruit_name 
WHERE good_fruits.fruit_name IS NOT NULL 
and bad_fruits.fruit_name IS NOT NULL
and good_fruits.fruit_name ILIKE '%apple%'
-- and bad_fruits.fruit_name ILIKE '%apple%' -- you can omit this condition

您也可以通过为表名提供假名来缩短此时间:

select 
    g.bar_code as "good_fruits.bar_code",
    g.fruit_name as "good_fruits.fruit_name", 
    b.fruit_name as "bad_fruits.fruit_name"
from 
   good_fruits g
   full outer join bad_fruits b
       on g.fruit_name=b.fruit_name 
WHERE g.fruit_name IS NOT NULL 
and b.fruit_name IS NOT NULL
and g.fruit_name ILIKE '%apple%'

【讨论】:

  • 感谢您的帮助。出于某种原因,我的查询没有返回任何结果。我知道我可以单独查询每个表并获得结果。我假设我可以查询两个表中的fruit_name列,并获取具有相似文本的行,例如fruit_name列中的apple。
  • g.fruit_name=b.fruit_name 条件通过精确匹配连接表。或许,这会有所帮助:stackoverflow.com/questions/20412170/…
  • 这些项目不准确,所以这可能是我的问题。我会做更多的研究。再次感谢您的帮助。
  • 当我使用 ILIKE 或 ~* 修改 = 和 ILIKE 限定符时,您的代码示例有效。我需要做更多的测试,因为我在一个表格中的fruit_names 格式为“apples”,而另一个表格的格式为“Fuji Apples”或“Apple Fuji”。所以不同格式的fruit_names 不会跨表链接。我需要将“apples”和“Fuji Apples”或“Apple Fuji”关联到我的返回结果中。这可能吗?
  • @Lifeiscomplex 比较字符串,例如,小写,即比较时使用'lower'函数:lower(g.fruit_name) ILIKE ...
猜你喜欢
  • 1970-01-01
  • 2013-11-24
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多