Using 'LIKE' with an 'IN' clause full of strings
I want to do a soft string match in a table, like this:
SELECT * FROM emailaddresses where addr in ('john@google.com', 'jim@google.com')
But if there is an addr value in the table 'JOHN@google.com', I want that re开发者_JS百科turned.
Sort of like this:
SELECT * FROM emailaddresses where addr LIKE in ('john@google.com', 'jim@google.com')
How do I do that?
put the values into a table and use a join
rather than an in
clause:
SELECT * FROM emailaddresses as ea
INNER JOIN addresses as a
ON ea.address like '%' + a.address + '%'
You can use the LOWER function
SELECT * FROM emailaddresses where LOWER(addr) in ('john@google.com', 'jim@google.com')
Which will convert all addr to lowercase, in which you can then compare the results to what you want.
Note that LIKE
will work either case-sensitively or case-insensitively depending upon which collation is in effect for the expression, but in your case, you have specified no wildcards so there is little point looking to use LIKE
.
The default SQL Server installation is case-insensitive.
If you want a case-insensitive compare because you've got a case-sensitive database, you can cast. I believe this is the appropriate syntax (I've never used it for an IN list on one side of an expression, though).
SELECT *
FROM emailaddresses
WHERE addr COLLATE SQL_Latin1_General_CP1_CI_AS
IN (
'john@google.com' COLLATE SQL_Latin1_General_CP1_CI_AS
,'jim@google.com' COLLATE SQL_Latin1_General_CP1_CI_AS
)
A real case for LIKE
would be something for something like addr LIKE '%@google.com"
We can use the 'LIKE-In' approach together in SQL but in somewhat different style, like the one below:
SELECT *
FROM emailaddresses
WHERE addr LIKE 'john@google.com' OR addr LIKE 'jim@google.com'
Try this using a cross join to a table containing a list of email's you want to search for:
declare @email table(
email_check nvarchar(500) not null)
insert into @email(email_check)
values('jack@google.com')
insert into @email(email_check)
values('john.@google.com')
select hit, ID, EMAIL_ADDRESS from (
select CHARINDEX(email_check, lower(EMAIL_ADDRESS)) hit, ID, EMAIL_ADDRESS
from Table_With_Email_Addresses
,@email
) t
where hit > 0
No need for a "like" since it will parse a string to find a match. Cheers!
select * from HotelAmenities_
where Pamenities in (
select distinct(pamenities)
from HotelAmenities_
where pamenities like '%Swimming%'
)
精彩评论