LIKE (Transact-SQL)
Berlaku untuk: Titik akhir analitik SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Platform System (PDW) SQL di Microsoft Fabric Warehouse di Microsoft Fabric
Menentukan apakah string karakter tertentu cocok dengan pola tertentu. Pola dapat mencakup karakter reguler dan karakter kartubebas. Selama pencocokan pola, karakter reguler harus sama persis dengan karakter yang ditentukan dalam string karakter. Namun, karakter wildcard dapat dicocokkan dengan fragmen arbitrer dari string karakter. Menggunakan karakter kartubebas membuat LIKE
operator lebih fleksibel daripada menggunakan operator perbandingan =
string dan !=
. Jika salah satu argumen bukan dari jenis data string karakter, Mesin Database SQL Server mengonversinya menjadi jenis data string karakter, jika memungkinkan.
Sintaks
Sintaks untuk SQL Server dan Azure SQL Database:
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
Sintaks untuk Azure Synapse Analytics dan Gudang Data Paralel:
match_expression [ NOT ] LIKE pattern
ESCAPE
dan STRING_ESCAPE
tidak didukung di Azure Synapse Analytics atau Analytics Platform System (PDW).
Argumen
match_expression
Ekspresi tipe data karakter yang valid.
pola
String karakter tertentu untuk dicari di match_expression, dan dapat menyertakan karakter kartubebas yang valid dalam tabel berikut. pola bisa maksimal 8.000 byte.
Jika match_expression adalah jenis data prioritas yang lebih tinggi daripada pola, dan panjang pola lebih besar dari match_expression, Anda akan mendapatkan kesalahan pemotongan selama konversi implisit nilai pola ke jenis match_expression .
Katakter kartubebas | Deskripsi | Contoh |
---|---|---|
% |
Setiap string karakter nol atau lebih. | WHERE title LIKE '%computer%' menemukan semua judul buku dengan kata computer di mana saja dalam judul buku. |
_ (garis bawah) |
Setiap karakter tunggal. | WHERE au_fname LIKE '_ean' menemukan semua nama depan empat huruf yang diakhir dengan ean (Dean , Sean , dan sebagainya). |
[ ] |
Setiap karakter tunggal dalam rentang [a-f] yang ditentukan atau atur [abcdef] . |
WHERE au_lname LIKE '[C-P]arsen' menemukan nama belakang penulis yang diakhir dengan arsen dan dimulai dengan karakter tunggal antara C dan P , misalnya Carsen , , Larsen Karsen , dan sebagainya. Dalam pencarian rentang, karakter yang disertakan dalam rentang dapat bervariasi tergantung pada aturan pengurutan kolater. |
[^] |
Karakter tunggal apa pun yang tidak berada dalam rentang [^a-f] yang ditentukan atau diatur [^abcdef] . |
WHERE au_lname LIKE 'de[^l]%' menemukan semua nama belakang penulis yang dimulai dengan de dan di mana huruf berikut tidak l . |
escape_character
Karakter diletakkan di depan karakter kartubebas untuk menunjukkan bahwa kartubebas ditafsirkan sebagai karakter biasa dan bukan sebagai kartubebas. escape_character adalah ekspresi karakter yang tidak memiliki default dan harus mengevaluasi ke hanya satu karakter.
Jenis Hasil
Boolean
Nilai hasil
LIKE
mengembalikan TRUE jika match_expression cocok dengan pola yang ditentukan.
Keterangan
Ketika Anda melakukan perbandingan string dengan menggunakan LIKE
, semua karakter dalam string pola signifikan. Karakter yang signifikan mencakup spasi di depan atau di belakang. Jika perbandingan dalam kueri adalah mengembalikan semua baris dengan string LIKE 'abc '
(abc
diikuti oleh spasi tunggal), baris di mana nilai kolom tersebut adalah abc
(abc
tanpa spasi) tidak dikembalikan. Namun, jejak kosong, dalam ekspresi tempat pola dicocokkan, diabaikan. Jika perbandingan dalam kueri adalah mengembalikan semua baris dengan string LIKE 'abc'
(abc
tanpa spasi), semua baris yang dimulai dengan abc
dan memiliki kosong berikutnya nol atau lebih dikembalikan.
Perbandingan string menggunakan pola yang berisi data karakter dan varchar mungkin tidak melewati perbandingan LIKE
karena bagaimana data disimpan untuk setiap jenis data. Contoh berikut meneruskan variabel karakter lokal ke prosedur tersimpan, lalu menggunakan pencocokan pola untuk menemukan semua karyawan yang nama belakangnya dimulai dengan sekumpulan karakter yang ditentukan.
-- Uses AdventureWorks
CREATE PROCEDURE FindEmployee @EmpLName CHAR(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT p.FirstName,
p.LastName,
a.City
FROM Person.Person p
INNER JOIN Person.Address a
ON p.BusinessEntityID = a.AddressID
WHERE p.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';
GO
FindEmployee
Dalam prosedur, tidak ada baris yang dikembalikan karena variabel karakter (@EmpLName
) berisi kosong di belakang setiap kali nama berisi kurang dari 20 karakter. LastName
Karena kolom adalah varchar, tidak ada kosong berikutnya. Prosedur ini gagal karena kosong berikutnya signifikan.
Namun, contoh berikut berhasil karena kosong berikutnya tidak ditambahkan ke variabel varchar .
-- Uses AdventureWorks
CREATE PROCEDURE FindEmployee @EmpLName VARCHAR(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT p.FirstName,
p.LastName,
a.City
FROM Person.Person p
INNER JOIN Person.Address a
ON p.BusinessEntityID = a.AddressID
WHERE p.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';
GO
Berikut set hasilnya.
FirstName LastName City
---------- -------------------- ---------------
Angela Barbariol Snohomish
David Barber Snohomish
(2 row(s) affected)
Kecocokan pola menggunakan LIKE
LIKE
mendukung pencocokan pola ASCII dan pencocokan pola Unicode. Ketika semua argumen (match_expression, pola, dan escape_character, jika ada) adalah jenis data karakter ASCII, pencocokan pola ASCII dilakukan. Jika salah satu argumen adalah jenis data Unicode, semua argumen dikonversi ke Unicode, dan pencocokan pola Unicode dilakukan. Saat Anda menggunakan data Unicode (jenis data nchar atau nvarchar ) dengan LIKE
, kosong berikutnya bersifat signifikan; namun, untuk data non-Unicode, kosong berikutnya tidak signifikan. Unicode LIKE
kompatibel dengan standar ISO. ASCII LIKE
kompatibel dengan versi SQL Server yang lebih lama.
Serangkaian contoh berikut menunjukkan perbedaan baris yang dikembalikan antara ascii dan pencocokan pola Unicode LIKE
.
-- ASCII pattern matching with char column
CREATE TABLE t (col1 CHAR(30));
INSERT INTO t
VALUES ('Robert King');
SELECT * FROM t
WHERE col1 LIKE '% King'; -- returns 1 row
-- Unicode pattern matching with nchar column
CREATE TABLE t (col1 NCHAR(30));
INSERT INTO t
VALUES ('Robert King');
SELECT * FROM t
WHERE col1 LIKE '% King'; -- no rows returned
-- Unicode pattern matching with nchar column and RTRIM
CREATE TABLE t (col1 NCHAR(30));
INSERT INTO t
VALUES ('Robert King');
SELECT * FROM t
WHERE RTRIM(col1) LIKE '% King'; -- returns 1 row
Catatan
LIKE
perbandingan dipengaruhi oleh kolase. Untuk informasi selengkapnya, lihat COLLATE (Transact-SQL).
%
Menggunakan karakter kartubebas
LIKE '5%'
Jika simbol ditentukan, Mesin Database mencari angka 5
diikuti oleh string nol atau lebih karakter apa pun.
Misalnya, kueri berikut menunjukkan semua tampilan manajemen dinamis dalam AdventureWorks2022
database, karena semuanya dimulai dengan huruf dm
.
-- Uses AdventureWorks
SELECT Name
FROM sys.system_views
WHERE Name LIKE 'dm%';
GO
Untuk melihat semua objek yang bukan tampilan manajemen dinamis, gunakan NOT LIKE 'dm%'
. Jika Anda memiliki total 32 objek dan LIKE
menemukan 13 nama yang cocok dengan pola, NOT LIKE
menemukan 19 objek yang tidak cocok dengan LIKE
pola.
Anda mungkin tidak selalu menemukan nama yang sama dengan pola seperti LIKE '[^d][^m]%'
. Alih-alih 19 nama, Anda mungkin hanya menemukan 14, dengan semua nama yang dimulai dengan d
atau memiliki m
sebagai huruf kedua yang dihilangkan dari hasil, dan nama tampilan manajemen dinamis. Perilaku ini karena string kecocokan dengan karakter wildcard negatif dievaluasi dalam langkah-langkah, satu kartubebas pada satu waktu. Jika kecocokan gagal pada titik mana pun dalam evaluasi, itu akan dihilangkan.
Menggunakan karakter kartubebas sebagai harfiah
Anda dapat menggunakan karakter pencocokan pola kartubebas sebagai karakter harfiah. Untuk menggunakan karakter kartubebas sebagai karakter literal, sertakan karakter kartubebas dalam tanda kurung. Tabel berikut ini memperlihatkan beberapa contoh penggunaan LIKE
kata kunci dan [ ]
karakter kartubebas.
Simbol | Makna |
---|---|
LIKE '5[%]' |
5% |
LIKE '[_]n' |
_n |
LIKE '[a-cdf]' |
a , b , c , d , atau f |
LIKE '[-acdf]' |
- , a , c , d , atau f |
LIKE '[ [ ]' |
[ |
LIKE ']' |
] |
LIKE 'abc[_]d%' |
abc_d dan abc_de |
LIKE 'abc[def]' |
abcd , abce , dan abcf |
Kecocokan pola dengan klausul ESCAPE
Anda dapat mencari string karakter yang menyertakan satu atau beberapa karakter wildcard khusus. Misalnya, tabel diskon dalam database pelanggan dapat menyimpan nilai diskon yang menyertakan tanda persen (%). Untuk mencari tanda persen sebagai karakter alih-alih sebagai karakter kartubebas, kata kunci ESCAPE dan karakter escape harus disediakan. Misalnya, database sampel berisi kolom bernama komentar yang berisi teks 30%. Untuk mencari baris apa pun yang berisi string 30% di mana saja di kolom komentar, tentukan klausa WHERE seperti WHERE comment LIKE '%30!%%' ESCAPE '!'
. Jika ESCAPE dan karakter escape tidak ditentukan, Mesin Database mengembalikan baris apa pun dengan string 30!
.
Jika tidak ada karakter setelah karakter escape dalam pola LIKE, pola tidak valid dan LIKE mengembalikan FALSE. Jika karakter setelah karakter escape bukan karakter kartubebas, karakter escape dibuang dan karakter berikut diperlakukan sebagai karakter biasa dalam pola. Karakter ini mencakup tanda persen (%), garis bawah (_), dan karakter kartubebas kurung siku kiri ([) ketika diapit dalam tanda kurung ganda ([ ]). Karakter escape dapat digunakan dalam karakter tanda kurung ganda ([ ]), termasuk untuk melepaskan tanda sisipan (^), tanda hubung (-), atau kurung kanan (]).
0x0000
(char(0)) adalah karakter yang tidak terdefinisi dalam kolase Windows, dan tidak dapat disertakan dalam LIKE.
Contoh
J. Gunakan LIKE dengan %
karakter kartubebas
Contoh berikut menemukan semua nomor telepon yang memiliki kode 415
area dalam PersonPhone
tabel.
-- Uses AdventureWorks
SELECT p.FirstName,
p.LastName,
ph.PhoneNumber
FROM Person.PersonPhone AS ph
INNER JOIN Person.Person AS p
ON ph.BusinessEntityID = p.BusinessEntityID
WHERE ph.PhoneNumber LIKE '415%'
ORDER BY p.LastName;
GO
Berikut set hasilnya.
FirstName LastName Phone
----------------- ------------------- ------------
Ruben Alonso 415-555-124
Shelby Cook 415-555-0121
Karen Hu 415-555-0114
John Long 415-555-0147
David Long 415-555-0123
Gilbert Ma 415-555-0138
Meredith Moreno 415-555-0131
Alexandra Nelson 415-555-0174
Taylor Patterson 415-555-0170
Gabrielle Russell 415-555-0197
Dalton Simmons 415-555-0115
(11 row(s) affected)
B. Gunakan NOT LIKE dengan %
karakter kartubebas
Contoh berikut menemukan semua nomor telepon dalam PersonPhone
tabel yang memiliki kode area selain 415
.
-- Uses AdventureWorks
SELECT p.FirstName,
p.LastName,
ph.PhoneNumber
FROM Person.PersonPhone AS ph
INNER JOIN Person.Person AS p
ON ph.BusinessEntityID = p.BusinessEntityID
WHERE ph.PhoneNumber NOT LIKE '415%'
AND p.FirstName = 'Gail'
ORDER BY p.LastName;
GO
Berikut set hasilnya.
FirstName LastName Phone
---------------------- -------------------- -------------------
Gail Alexander 1 (11) 500 555-0120
Gail Butler 1 (11) 500 555-0191
Gail Erickson 834-555-0132
Gail Erickson 849-555-0139
Gail Griffin 450-555-0171
Gail Moore 155-555-0169
Gail Russell 334-555-0170
Gail Westover 305-555-0100
(8 row(s) affected)
C. Menggunakan klausa ESCAPE
Contoh berikut menggunakan klausul ESCAPE
dan karakter escape untuk menemukan string 10-15%
karakter yang tepat di kolom c1
mytbl2
tabel.
USE tempdb;
GO
IF EXISTS (
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'mytbl2'
)
DROP TABLE mytbl2;
GO
USE tempdb;
GO
CREATE TABLE mytbl2 (c1 SYSNAME);
GO
INSERT mytbl2
VALUES ('Discount is 10-15% off'),
('Discount is .10-.15 off');
GO
SELECT c1
FROM mytbl2
WHERE c1 LIKE '%10-15!% off%' ESCAPE '!';
GO
D. [ ]
Menggunakan karakter kartubebas
Contoh berikut menemukan karyawan pada Person
tabel dengan nama Cheryl
depan atau Sheryl
.
-- Uses AdventureWorks
SELECT BusinessEntityID,
FirstName,
LastName
FROM Person.Person
WHERE FirstName LIKE '[CS]heryl';
GO
Contoh berikut menemukan baris untuk karyawan dalam Person
tabel dengan nama Zheng
belakang atau Zhang
.
-- Uses AdventureWorks
SELECT LastName,
FirstName
FROM Person.Person
WHERE LastName LIKE 'Zh[ae]ng'
ORDER BY LastName ASC,
FirstName ASC;
GO
Contoh: Azure Synapse Analytics and Analytics Platform System (PDW)
E. Gunakan LIKE dengan %
karakter kartubebas
Contoh berikut menemukan semua karyawan dalam DimEmployee
tabel dengan nomor telepon yang dimulai dengan 612
.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
Phone
FROM DimEmployee
WHERE phone LIKE '612%'
ORDER BY LastName;
F. Gunakan NOT LIKE dengan %
karakter kartubebas
Contoh berikut menemukan semua nomor telepon dalam DimEmployee
tabel yang tidak dimulai dengan 612
.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
Phone
FROM DimEmployee
WHERE phone NOT LIKE '612%'
ORDER BY LastName;
G. Gunakan LIKE dengan _
karakter kartubebas
Contoh berikut menemukan semua nomor telepon yang memiliki kode area yang dimulai dengan 6
dan berakhiran 2
DimEmployee
dalam tabel. Karakter kartubebas % disertakan di akhir pola pencarian agar sesuai dengan semua karakter berikut dalam nilai kolom telepon.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
Phone
FROM DimEmployee
WHERE phone LIKE '6_2%'
ORDER BY LastName;