簡體   English   中英

Postgres查詢以基於模糊匹配的記錄返回集合中的值

[英]Postgres query to return records based fuzzy match with values in a set

如下所示,我有兩個表,一個包含有關人的信息,另一個包含有關體育的信息。

我想對人員表進行查詢,僅返回描述包含成本表中列出的運動的記錄。 如果描述僅包含運動,而沒有其他文本,則在將所有內容都轉換為小寫字母之后,我可以輕松地將其作為內部聯接進行。 但是,由於考慮到描述中的其他信息,我在想,我可能需要對子查詢和/或正則表達式執行某些操作。

 name  | age |               description                
-------+-----+------------------------------------------
 bill  |  15 | I like to play soccer
 bob   |  20 | In my free time, I like to play BASEBALL
 jim   |  25 | I play video games everyday!!
 tony  |  30 | Im a really big fan of Hockey!!
 sandy |  35 | I could play soccer and hockey everyday


  sport   | cost 
----------+------
 soccer   |  100
 baseball |  150
 hockey   |  200

最終,此查詢將返回下表,該表不包含吉姆,因為其描述中的所有單詞均不在成本表的“體育”列中。 有時候,運動可能是一個字,而有時他們可能是多個字。 如果運動中包含多個單詞,我希望所有這些單詞在說明中一起出現,以便返回。

 name  | age |               description                
-------+-----+------------------------------------------
 bill  |  15 | I like to play soccer
 bob   |  20 | In my free time, I like to play BASEBALL
 tony  |  30 | Im a really big fan of Hockey!!
 sandy |  35 | I could play soccer and hockey everyday

我知道我可以針對每種運動單獨進行此操作,但我希望有更好的方法可以執行此操作。

SELECT *
FROM person
WHERE lower(description) LIKE '%hockey%';

 name  | age |               description               
-------+-----+-----------------------------------------
 tony  |  30 | Im a really big fan of Hockey!!
 sandy |  35 | I could play soccer and hockey everyday

創建下面的表的代碼


CREATE TABLE person (name VARCHAR(10), age INT, description VARCHAR(100));
INSERT INTO person (name, age, description) VALUES ("bill", 15, "I like to play soccer")
INSERT INTO person (name, age, description) VALUES ("bob", 20, "In my free time, I like to play BASEBALL")
INSERT INTO person (name, age, description) VALUES ("jim", 25, "I play video games everyday!!")
INSERT INTO person (name, age, description) VALUES ("tony", 30, "Im a really big fan of Hockey!!")
INSERT INTO person (name, age, description) VALUES ("sandy", 35, "I could play soccer and hockey everyday")

CREATE TABLE cost (sport VARCHAR(10), cost INT);
INSERT INTO cost (sport, cost) VALUES ('soccer', 100);
INSERT INTO cost (sport, cost) VALUES ('baseball', 150);
INSERT INTO cost (sport, cost) VALUES ('hockey', 200);

您可以使用聯接:

SELECT DISTINCT p.name,p.age,p.description
FROM person p
  JOIN cost c ON p.description LIKE '%'||c.sport||'%'

DISTINCT是必要的,以避免Sandy獲得兩行。

另外,您可以使用EXISTS和一個子查詢:

SELECT p.name,p.age,p.description
FROM person p
WHERE EXISTS (
  SELECT 1
  FROM cost c
  WHERE p.description LIKE '%'||c.sport||'%')

EXISTS檢查子查詢是否返回至少一行,因此與在子查詢中選擇什么無關。 那么為什么不1?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM