0

テーブル内の 2 つのフィールドarticles:

titlebody

2 つのレコード:

meow bark | 1234 5678bird snake | 8596 2952

はどこmeow barkにありtitle、どこに1234 5678あるのかbodyなど...

SQL クエリ:

SELECT *, 
       CASE WHEN title = 'meow' then 1 else 0 end + CASE WHEN title = 'bark' then 1 else 0 end AS matches 
FROM  articles 
ORDER BY matches DESC

両方の行を返します。私の構文の何が問題なのかを理解するのを手伝ってください。タイトルがクエリの内容と一致する行のみを返すことを期待しています。CASE がどのように機能するかを理解していない場合を除き、上記の例のタイトルが meow または bark と一致する場合は表示されますが、そうでない場合は表示されません。

目標は、ほとんどの一致に基づいて結果を返すことです。ここでフィドルを見てください:http://sqlfiddle.com/#!3/13b33/10

私はそれを少し修正しましたが、それを壊すほど十分には考えていませんでした。

4

3 に答える 3

3

行を除外する場合は、SELECT 句ではなく WHERE 句に入れる必要があります。

また、使用している比較は同等性のためのものです。あなたが考えるように、列に検索値が含まれている場合、これは「一致」しませんが、列にまったく同じテキストがあり、他に何もない場合に限ります(照合に多少の余裕があります)。

于 2013-02-27T22:16:56.513 に答える
3

何を達成したいのかわからない...何を返してほしいですか

これはあなたが望むものに少し近いかもしれません

SELECT *, 
       matches = CASE WHEN title LIKE '%meow5' THEN 1 ELSE 0 END + CASE WHEN title LIKE '%bark5' THEN 1 ELSE 0 END  
FROM   articles 
ORDER BY matches desc

OPが更新された後に編集

WHERE一部のレコードのみを返したい場合は、句を使用してみてください。

SELECT *
FROM   articles 
WHERE  title LIKE '%meow%' 
       OR 
       title LIKE '%bark%'
ORDER BY matches desc

最終編集

このフィドルを試してください

Fiddle が古くなった場合のスクリプトは次のとおりです。

CREATE TABLE  YourTable (FieldToSearch varchar(max));
INSERT INTO YourTable 
VALUES
('If there were a dog'),
('If there was a dog'),
('If that dog died!'),
('I''d be happy with cat');

SELECT x.*
FROM   (
       SELECT FieldToSearch, 
       CASE WHEN ' ' + FieldToSearch + ' ' like '% if %' then 1 else 0 end
       + CASE WHEN ' ' + FieldToSearch + ' ' like '% there %' then 1 else 0 end 
       + CASE WHEN ' ' + FieldToSearch + ' ' like '% was %' then 1 else 0 end
       + CASE WHEN ' ' + FieldToSearch + ' ' like '% a %' then 1 else 0 end
       + CASE WHEN ' ' + FieldToSearch + ' ' like '% dog %' then 1 else 0 end AS matches
      FROM YourTable
      )x
WHERE x.matches >0
ORDER BY x.matches DESC;
于 2013-02-27T22:19:12.657 に答える
0

クエリに where 句が記載されていない場合、where 条件を使用してそれらをフィルタリングしない限り、すべてのレコードが取得されます

于 2013-02-27T22:22:43.737 に答える