2016-12-17 6 views
0

以下に示すように、私は人に関する情報を含むテーブルとスポーツに関する情報を含むテーブルを2つ持っています。セット内の値とファジーマッチに基づいてレコードを返すPostgresクエリ

私は人物テーブルに対してクエリを行い、コストテーブルにリストされているスポーツが記述されているレコードのみを返します。記述にスポーツだけが含まれ、他のテキストは含まれていない場合は、すべてを小文字にした後、簡単に内部結合として行うことができます。しかし、私は説明の追加情報のために考えている、私はサブクエリや正規表現で何かをする必要があります。彼の説明内の単語のどれもコストテーブルのスポーツ欄ではなかったよう

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 

は最終的には、このクエリは、ジムが含まれていません。次の表を参照して、返します。いくつかの時間スポーツは1つの単語かもしれない、他の回それらは複数の単語かもしれない。スポーツに複数の単語が含まれている場合は、その単語がすべて返されるように説明に含めてください。

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); 

答えて

1

下の表を作成するコードは、加入:

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

DISTINCTはサンディのための2つの行を避けることが必要です。

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

サブクエリが返す少なくとも1行かどうかのチェックをEXISTS、それはサブクエリで選択するために何を、無関係です:

また、あなたが存在し、サブクエリを使用することができます。それでなぜ1ではないのですか?

関連する問題