LIKE in SQL

Facebooktwitterredditpinterestlinkedinmail

The LIKE operator in SQL Server allows you to query data using patterns instead of exact matches. Normal select statements using the = operator will only return records where there is an exact match (usually the casing or trailing spaces do not matter). With the LIKE operator, it does not need to be an exact match.

LIKE
The most basic concept of the like operator is that it allows you to query data without using an exact match in the WHERE clause. It allows you to use some wildcard characters to get the results you are looking for. Here is a basic example:

SELECT	*
FROM	Animal
WHERE	AnimalName LIKE 'Giant %'

[table width=”500″ colwidth=”20|100|50″ colalign=”left|left|center|left|right”]
AnimalID,AnimalName,AnimalType,Animal Weight
35,Giant Squid,Fish,400
36,Giant Panda,Mammal,500
37,Giant Clam,Fish,60
[/table]

The above statement uses the % as a wildcard. It basically says, show me any animals that start with the word Giant. This would return things like Giant Panda, Giant Squid, and Giant Clam.

Although % is the most common wildcard that is used with LIKE, there are many more. Here is a list of all the allowed wildcards.

%
Will allow zero or any characters. You can use this before, after, or in-between any string.

SELECT	*
FROM	Animal
WHERE	AnimalName LIKE 'GIANT %'
	OR AnimalName LIKE '% Penguin'
	OR AnimalName LIKE 'Hammer% Shark'

[table width=”500″ colwidth=”20|100|50″ colalign=”left|left|center|left|right”]
AnimalID,AnimalName,AnimalType,Animal Weight
35,Giant Squid,Fish,400
36,Giant Panda,Mammal,500
37,Giant Clam,Fish,60
38,Emperor Penguin,Bird,15
39,Hammer Head Shark,Fish,90
[/table]

 
_
Will allow any 1 character.

SELECT	*
FROM	Animal
WHERE	AnimalName LIKE 'Chicke_'

[table width=”500″ colwidth=”20|100|50″ colalign=”left|left|center|left|right”]
AnimalID,AnimalName,AnimalType,Animal Weight
18,Chicken,Bird,5
[/table]

 
[]
Will allow 1 character that is specified in the brackets. There are two ways to specify this. [a-d] or [abcd].

The following example will match both goose and moose.

SELECT	*
FROM	Animal
WHERE	AnimalName LIKE '[gm]oose'

[table width=”500″ colwidth=”20|100|50″ colalign=”left|left|center|left|right”]
AnimalID,AnimalName,AnimalType,Animal Weight
11,Goose,Bird,15
27,Moose,Mammal,1000
[/table]

 
The following example will match both cat and bat, but it will NOT match rat.

SELECT	*
FROM	Animal
WHERE	AnimalName LIKE '[a-d]at'

[table width=”500″ colwidth=”20|100|50″ colalign=”left|left|center|left|right”]
AnimalID,AnimalName,AnimalType,Animal Weight
10,Cat,Mammal,10
34,Bat,Bird,1
[/table]

 
[^]
Will match any 1 character that is NOT specified in the brackets. There are two ways to specify this. [^a-d] or [^abcd].

The following example will match horse, but will NOT match zorse… and yes, zorse is an animal… I found it on the internet.

SELECT	*
FROM	Animal
WHERE	AnimalName LIKE '[^z]orse'

[table width=”500″ colwidth=”20|100|50″ colalign=”left|left|center|left|right”]
AnimalID,AnimalName,AnimalType,Animal Weight
6,Horse,Mammal,750
[/table]

 
The following example will match rat, but will NOT match bat or cat.

SELECT	*
FROM	Animal
WHERE	AnimalName LIKE '[^a-d]at'

[table width=”500″ colwidth=”20|100|50″ colalign=”left|left|center|left|right”]
AnimalID,AnimalName,AnimalType,Animal Weight
33,Rat,Mammal,1
[/table]

 
Important
If you are comparing a CHAR data type with the like operator, it may not work correctly. This because when you save data to a CHAR field it will space pad the field to the size of the field. To get around this, you need to trim the spaces from the end of the field.

SELECT	*
FROM	Animal
WHERE	RTRIM(AnimalName) LIKE '%monkey'

 
NOT Like
If you want to match where a pattern is NOT like a string, simply put the word NOT in front of the word LIKE.

SELECT	*
FROM	Animal
WHERE	AnimalName NOT LIKE ‘%monkey’

 
 
Escaping The Wildcard
From time to time you will need to actually search for a pattern containing one of the wildcard characters. Let’s say that you wanted to search for anything in a string that had 10% in it. The % (percent symbol) is a reserved word with the LIKE operator. You would search for the % character by using the ESCAPE clause.

SELECT	*
FROM	Invoice
WHERE	LineItemDescription LIKE '10!%%' ESCAPE '!'

In the query above, you can see that !% in the comparison string means to the literal character %. The ESCAPE clause tells the query to not apply the wildcard rules to any character following the specified characters. In this case, we are specifying the ! (exclamation mark).

[table width=”500″ colwidth=”20|100|50″ colalign=”left|left|center|left|right”]
InvoiceID,ItemName,LineItemDescription
1,Coupon Code,10% off web coupon
[/table]

 
Reference: https://msdn.microsoft.com/en-us/library/ms179859.aspx

How To Pull Single Value From XML

Facebooktwitterredditpinterestlinkedinmail

SQL Server has a built in method for easily pulling one value from an XML. To do this you use the method called .value(). The .value method will run an XQuery against the XML specified in the query. This method is scalar, so it will only return 1 value. You cannot use this to return multiple values.

DECLARE	@XMLToParse  XML
 
-- Load the XML data in to a variable to work with.
-- This would typically be passed as a parameter to a stored procedure
SET	@XMLToParse =	'
						Baboon
					 '

SELECT  @XMLToParse.value('data(/Animal/AnimalName)[1]',
							'VARCHAR(MAX)') AS AnimalName

In the query above, you can see that you can just pass the xpath and the datatype that you want the output to be. This will pull that value out of the XML and put it in the specified format. You can see that after the xpath, there is a funny syntax [1]. This tells SQL Server to grab the first instance of the AnimalName node. You need to do this because the .value() method only returns one value and will not work with a repeating node.

Reference: https://msdn.microsoft.com/en-us/library/ms178030.aspx

Cross Apply In SQL

Facebooktwitterredditpinterestlinkedinmail

CROSS APPLY is one of those helpful things in SQL Server that most people don’t think of or may not even know about. In this article I’d like to talk about what the APPLY operator is and how we can use it to simplify our sql statements.

APPLY Operator
The APPLY operator allows you to join a table to a table-valued function. A table-valued function is a function that will return a table with one or more columns. With the apply operator, you can pass values from the first table in to the table-valued function.

There are only 2 types of APPLY operators:
CROSS APPLY – Returns records when a value from both sides of the operator match. Like an INNER JOIN.
OUTER APPLY – Returns all rows from the other side of the operator and will return the value or NULL from the table-valued function. This is like an OUTER JOIN.

SELECT	A.AnimalName,
		H.HabitatName
FROM	Animal A
CROSS	APPLY GetAnimalHabitat(A.AnimalTypeCode) H

In the example above, you can see that we join to the GetAnimalHabitat function using the CROSS APPLY. You can imagine that this function does a bunch of logic that is not visible in this query. If the GetAnimalHabitat function had 25 lines of code, you can see how this simplifies the above query dramatically.

Additional Thoughts
The APPLY operator can simplify the code, but could be accomplished by joining to a sub query as well. One difference is that the function in the APPLY operator is being executed for every row in the outer table. If you use the APPLY operator, make sure that you test the speed of your query to make sure that it did not degrade performance.