在多个表中查询相似的文本字符串

时间:2018-12-23 19:12:37

标签: python-3.x postgresql

我正在使用将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

1 个答案:

答案 0 :(得分: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%'