[英]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.