Here is the SQL that goes with the demo.
-- Database by Doug
-- Douglas Kline
-- 5/19/2016
-- LIKE, advanced
use northwind
-- some advanced things to do with LIKE
-- if you are new to using LIKE, see my earlier video
-- previous video covers simple wildcard matching with % and _
-- we'll cover character sets
-- and specific use cases, i.e., how to do....
-- let's start with a simple example from the products table
SELECT ProductName,
ProductID,
Unitprice
FROM Products
ORDER BY ProductName
-- notice that there are 77 products
-- now, let's limit that to all the products
-- whose names start with the letter A
SELECT ProductName,
ProductID,
Unitprice
FROM Products
WHERE ProductName LIKE 'a%'
ORDER BY ProductName
-- what about begins with A or B or C
SELECT ProductName,
ProductID,
Unitprice
FROM Products
WHERE ProductName LIKE 'a%'
OR ProductName LIKE 'b%'
OR ProductName LIKE 'c%'
ORDER BY ProductName
-- can also be phrased as
SELECT ProductName,
ProductID,
Unitprice
FROM Products
WHERE ProductName LIKE '[abc]%'
ORDER BY ProductName
-- the square brackets mean:
-- "a single character from within this set"
SELECT ProductName,
ProductID,
Unitprice
FROM Products
WHERE ProductName LIKE '[abc][lho]%'
ORDER BY ProductName
-- this one means
-- first letter is from this set: [abc]
-- second letter is from this set: [lho]
-- then zero or more characters after the first two letters
-- this can also be phrased as a "list", like this:
SELECT ProductName,
ProductID,
Unitprice
FROM Products
WHERE ProductName LIKE '[a-c][lho]%'
ORDER BY ProductName
-- the hyphen means,
-- all characters alphabetically between the two letters
-- what about this?
-- products whose name does not start with
-- an a or b or c
SELECT ProductName,
ProductID,
Unitprice
FROM Products
WHERE NOT (ProductName LIKE 'a%'
OR ProductName LIKE 'b%'
OR ProductName LIKE 'c%')
ORDER BY ProductName
-- another option:
SELECT ProductName,
ProductID,
Unitprice
FROM Products
WHERE ProductName NOT LIKE '[abc]%' -- using NOT
ORDER BY ProductName
-- can be rephrased like this:
SELECT ProductName,
ProductID,
Unitprice
FROM Products
WHERE ProductName LIKE '[^abc]%'
ORDER BY ProductName
-- note the carat symbol ^ inside the brackets
-- this means
-- "any single character not in this list"
-- and this:
SELECT ProductName,
ProductID,
Unitprice
FROM Products
WHERE ProductName LIKE '[^abc][^lho]%'
ORDER BY ProductName
-- this one means
-- first letter is NOT from this set: [abc]
-- second letter is NOT from this set: [lho]
-- then zero or more characters after the first two letters
-- another
SELECT ProductName,
ProductID,
Unitprice
FROM Products
WHERE ProductName LIKE '[a-ce-j]%' -- skips d
ORDER BY ProductName
-- means single letter in the set of letters
-- a thru c OR e thru j
-- then zero or more letters
-- so let's go through some common uses
-- number of letters
-- has at least 6 characters
SELECT 'match' as [test]
WHERE '1234567' LIKE '______%' -- 6 underscores
SELECT 'match' as [test]
WHERE '12345' LIKE '______%' -- 6 underscores
-- begins with a letter
SELECT 'match'
WHERE 'product' LIKE '[a-z]%'
SELECT 'match'
WHERE '3product' LIKE '[a-z]%'
-- begins with a letter
-- and is at least 6 characters
SELECT 'match'
WHERE 'a12345' LIKE '[a-z]_____%' -- 5 underscores
SELECT 'match'
WHERE 'a1234' LIKE '[a-z]_____%' -- 5 underscores
SELECT 'match'
WHERE '012345' LIKE '[a-z]_____%' -- 5 underscores
-- begins with a number
SELECT 'match'
WHERE '0abcdefgh' LIKE '[0-9]______%' -- 6 underscores
-- begins with a letter, contains a number
SELECT 'match'
WHERE 'abc5' LIKE '[a-z]%[0-9]%'
-- ending / trailing spaces
SELECT 'match'
WHERE ' abc' LIKE ' %'
-- ending / trailing punctuation
SELECT 'match'
WHERE '?abc345' LIKE '[!@#$%?,.]%'
-- whitespace char, i.e., tab
-- note that char(9) returns the ASCII tab character
-- also note that + is the concatenation operator
-- thus the format string is square brackets
-- with a space and a tab character
-- it checks for tabs or spaces
SELECT 'match'
WHERE 'db' + char(9) + 'Doug' LIKE '%[ ' + char(9) + ']%'
-- detect punctuation character
-- ASCII has
SELECT 'match'
WHERE 'abc{abc'
LIKE '%['
+ char(33) + '-' + char(47) -- ASCII '!' thru '/'
+ char(58) + '-' + char(64) -- ASCII ':' thru '@'
+ char(91) + '-' + char(96) -- ASCII '[' thru '`'
+ char(123)+ '-' + char(126)-- ASCII '{' thru '~'
+ ']%'
SELECT 'match'
WHERE 'abc]abc'
LIKE '%['
+ char(33) + '-' + char(47) -- ASCII '!' thru '/'
+ char(58) + '-' + char(64) -- ASCII ':' thru '@'
+ char(91) + '-' + char(96) -- ASCII '[' thru '`'
+ char(123)+ '-' + char(126)-- ASCII '{' thru '~'
+ ']%'
-- contains unprintable characters
SELECT 'match'
WHERE 'abc'
+ char(7) -- bell character
+ 'abc'
LIKE '%[^' -- note the carat here
+ char(32) + '-' + char(126)
+ ']%'
-- same technique can be used for whitespace characters
-- same technique can be used for unicode character set
-- Database by Doug
-- Douglas Kline
-- 5/19/2016
-- LIKE, advanced
EXCELENT
ReplyDelete