|
SELECT multiple LIKE clauses and return how many columns match
Brad Brening posted on Friday, July 27, 2007 2:43 PM
Thanks to Hugo Kornelis, (blog: http://sqlblog.com/blogs/hugo_kornelis)
I've made major progress toward creating a query that will take
multiple LIKE clauses and return the records that match along with a
custom column describing how many matches those columns contain.
For example, I have a table with many threaded messages. Given one or
more search words, I'd like to be able to dynamically build a SQL
query and return the "Relevance" (how many matches were found), the
Thread_ID, and the actual message that matched one or more terms.
In order to do this, Hugo offered the excellent query below:
-------------------------------------------------
SELECT
CASE
WHEN ((Message LIKE '%term1%') AND (Message LIKE '%term2%') THEN 100
WHEN ((Message LIKE '%term1%') OR (Message LIKE '%term2%') THEN 50
END
AS Relevance, Thread_ID, Message FROM tblThread
WHERE (Message LIKE '%term1%') OR (Message LIKE '%term2%') ORDER BY
Relevance DESC
-------------------------------------------------
Since I'm building this query dynamically, I can extend it for even
more terms:
-------------------------------------------------
SELECT
CASE
WHEN ((Message LIKE '%term1%') AND (Message LIKE '%term2%') AND
(Message LIKE '%term3%') AND (Message LIKE '%term4%')) THEN 100
WHEN ((Message LIKE '%term1%') AND (Message LIKE '%term2%') AND
(Message LIKE '%term3%') OR (Message LIKE '%term4%')) THEN 75
WHEN ((Message LIKE '%term1%') AND (Message LIKE '%term2%') OR
(Message LIKE '%term3%') OR (Message LIKE '%term4%'))THEN 50
WHEN ((Message LIKE '%term1%') OR (Message LIKE '%term2%') OR
(Message LIKE '%term3%') OR (Message LIKE '%term4%'))THEN 25
END
AS Relevance, Thread_ID, Message FROM tblThread
WHERE (Message LIKE '%term1%') OR (Message LIKE '%term2%') OR (Message
LIKE '%term3%') OR (Message LIKE '%term4%') ORDER BY Relevance DESC
-------------------------------------------------
This is great in that it does what I want it to do - return the
in the Message column.
However, there's a logical problem here. (I should note that the
logical flaw is in no way attributed to Hugo's answer - his solution
did exacly what I initially asked). Using the example above, what if
term1 and term4 match, but term2 and term3 do not? This logic above
would return 25 - even though it SHOULD be 50.
So, I've been researching IF-THEN, but I'm getting nowhere quick! I
tried something similar to this, but it fails:
SELECT
(
DECLARE @cnt INT
SET @cnt = 0
IF (Message LIKE '%term1%') @cnt = @cnt + 1
IF (Message LIKE '%term2%') @cnt = @cnt + 1
IF (Message LIKE '%term3%') @cnt = @cnt + 1
RETURN @cnt
)
AS Relevance, Thread_ID, Message FROM tblThread
WHERE (Message LIKE '%term1%') OR (Message LIKE '%term2%') OR (Message
LIKE '%term3%') ORDER BY Relevance DESC
Am I anywhere near the right track?
Thanks in advance;
Brad Brening |
|
|
|
|
You can't use IF THEN in a query.
Aaron Bertrand [SQL Server MVP] posted on Friday, July 27, 2007 2:50 PM
You can't use IF THEN in a query. How about:
SELECT
Relevance = 0 +
CASE WHEN Message LIKE '%term1%' THEN 1 ELSE 0 END
CASE WHEN Message LIKE '%term2%' THEN 1 ELSE 0 END
CASE WHEN Message LIKE '%term3%' THEN 1 ELSE 0 END
CASE WHEN Message LIKE '%term4%' THEN 1 ELSE 0 END
CASE WHEN Message LIKE '%term5%' THEN 1 ELSE 0 END
...
--
Aaron Bertrand
SQL Server MVP |
|
SELECT multiple LIKE clauses and return how many columns match
Brad Brening posted on Friday, July 27, 2007 3:01 PM
That looks very promising! I will give that a try. |
|
SELECT multiple LIKE clauses and return how many columns match
Brad Brening posted on Friday, July 27, 2007 3:15 PM
On Jul 27, 1:50 pm, "Aaron Bertrand [SQL Server MVP]"
Still no luck. I get an "Incorrect syntax near the keyword CASE"
error. Here's my query:
SELECT Relevance = 0 +
(
CASE WHEN Message LIKE '%term1%' THEN 1 ELSE 0 END
CASE WHEN Message LIKE '%term2%' THEN 1 ELSE 0 END
CASE WHEN Message LIKE '%term3%' THEN 1 ELSE 0 END
)
, Thread_ID, Message FROM tblThread
WHERE (Message LIKE '%term1%') OR (Message LIKE '%term2%') OR (Message
LIKE '%term3%') ORDER BY Relevance DESC |
|
I forgot the + operators, but why the parens?
Aaron Bertrand [SQL Server MVP] posted on Friday, July 27, 2007 3:26 PM
I forgot the + operators, but why the parens?
SELECT Relevance = 0
+ CASE WHEN Message LIKE '%term1%' THEN 1 ELSE 0 END
+ CASE WHEN Message LIKE '%term2%' THEN 1 ELSE 0 END
+ CASE WHEN Message LIKE '%term3%' THEN 1 ELSE 0 END |
|
SELECT multiple LIKE clauses and return how many columns match
Brad Brening posted on Friday, July 27, 2007 3:36 PM
That did it!
I had placed those parens trying to avoid the error.
Thanks for you assistance;
Brad Brening |
|
|
|
|
Didn't Find The Answer You Were Looking For? |
| EggHeadCafe has experts online right now that may know the answer to your question. We pay them a bonus for answering as many questions as they can. So, why not help them and yourself by becoming a member (free) and ask them your question right now? |
| Create Account & Ask Question In Live Forum |
|
|
|