LIKE (Transact-SQL)
Berlaku untuk:
SQL Server (semua versi yang didukung)
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics Analytics
Platform System (PDW)
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 operator LIKE 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
-- Syntax for SQL Server and Azure SQL Database
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse
match_expression [ NOT ] LIKE pattern
Catatan
Saat ini ESCAPE dan STRING_ESCAPE tidak didukung di Azure Synapse Analytics atau Analytics Platform System (PDW).
Catatan
Untuk melihat sintaks transact-SQL untuk SQL Server 2014 dan yang lebih lama, lihat Dokumentasi versi sebelumnya.
Argumen
match_expression
Adalah ekspresi tipe data karakter yang valid.
pola
Adalah string karakter tertentu untuk dicari di match_expression, dan dapat menyertakan karakter kartubebas yang valid berikut ini. pola bisa maksimal 8.000 byte.
| Katakter kartubebas | Deskripsi | Contoh |
|---|---|---|
| % | Setiap string karakter nol atau lebih. | WHERE title LIKE '%computer%' menemukan semua judul buku dengan kata 'komputer' di mana saja dalam judul buku. |
| _ (garis bawah) | Setiap karakter tunggal. | WHERE au_fname LIKE '_ean' menemukan keempat huruf pertama yang diakhir dengan ean (Dean, Sean, dan sebagainya). |
| [ ] | Setiap karakter tunggal dalam rentang yang ditentukan ([a-f]) atau set ([abcdef]). | WHERE au_lname LIKE '[C-P]arsen' menemukan nama belakang penulis yang berakhir 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 kolabasi. |
| [^] | Setiap karakter tunggal yang tidak berada dalam rentang yang ditentukan ([^a-f]) atau set ([^abcdef]). | WHERE au_lname LIKE 'de[^l]%' menemukan semua nama belakang penulis yang dimulai dengan de dan di mana huruf berikut bukan l. |
escape_character
Adalah karakter yang 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 hanya satu karakter.
Jenis Hasil
Boolean
Nilai Hasil
LIKE mengembalikan TRUE jika match_expression cocok dengan pola yang ditentukan.
Keterangan
Saat Anda melakukan perbandingan string dengan menggunakan LIKE, semua karakter dalam string pola signifikan. Karakter 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, di akhir kosong, dalam ekspresi di mana 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 nol atau lebih kosong berikutnya 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 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 berikutnya 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 JOIN Person.Address a ON p.BusinessEntityID = a.AddressID
WHERE p.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';
Berikut adalah hasil yang ditetapkan.
FirstName LastName City
---------- -------------------- ---------------
Angela Barbariol Snohomish
David Barber Snohomish
(2 row(s) affected)
Pencocokan Pola dengan 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 pencocokan pola Unicode dan Unicode dilakukan. Saat Anda menggunakan data Unicode (jenis data nchar atau nvarchar ) dengan LIKE, kosong berikutnya 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.
Berikut ini adalah serangkaian contoh yang menunjukkan perbedaan baris yang dikembalikan antara pencocokan pola ASCII dan 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
Perbandingan LIKE dipengaruhi oleh kolase. Untuk informasi selengkapnya, lihat COLLATE (Transact-SQL).
Menggunakan Karakter KartuBebas %
Jika simbol LIKE '5%' ditentukan, Mesin Database mencari angka 5 diikuti dengan string nol karakter atau lebih.
Misalnya, kueri berikut menunjukkan semua tampilan manajemen dinamis dalam database AdventureWorks2012 , 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 pola LIKE.
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 kartubebas negatif dievaluasi dalam langkah-langkah, satu kartubebas pada satu waktu. Jika kecocokan gagal kapan saja dalam evaluasi, itu akan dihilangkan.
Menggunakan Karakter Wildcard Sebagai Literal
Anda dapat menggunakan karakter pencocokan pola kartubebas sebagai karakter harfiah. Untuk menggunakan karakter kartubebas sebagai karakter harfiah, sertakan karakter kartubebas dalam tanda kurung siku. Tabel berikut ini memperlihatkan beberapa contoh penggunaan kata kunci LIKE 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 |
| SEPERTI '[ [ ]' | [ |
| SEPERTI ']' | ] |
| LIKE 'abc[_]d%' | abc_d dan abc_de |
| LIKE 'abc[def]' | abcd, abce, dan abcf |
Pencocokan 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, polanya tidak valid dan LIKE mengembalikan FALSE. Jika karakter setelah karakter escape bukan karakter kartubebas, karakter escape akan dibuang dan karakter berikut diperlakukan sebagai karakter biasa dalam pola. Karakter ini mencakup tanda persen (%), garis bawah (_), dan karakter kartubebas tanda kurung kiri ([) ketika diapit dalam tanda kurung ganda ([ ]). Karakter escape dapat digunakan dalam karakter tanda kurung ganda ([ ]), termasuk untuk meloloskan tanda sisipan (^), tanda hubung (-), atau kurung siku kanan (]).
0x0000 (char(0)) adalah karakter yang tidak terdefinisi dalam kolase Windows dan tidak dapat disertakan dalam LIKE.
Contoh
A. Menggunakan 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 adalah tataan hasil.
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. Menggunakan 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 adalah hasil yang ditetapkan.
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 c1mytbl2 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. Menggunakan 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. Menggunakan 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. Menggunakan LIKE dengan karakter kartubebas _
Contoh berikut menemukan semua nomor telepon yang memiliki kode area yang dimulai dengan 6 dan berakhiran DimEmployee dalam 2 tabel. Karakter kartubebas % disertakan di akhir pola pencarian untuk mencocokkan semua karakter berikut dalam nilai kolom telepon.
-- Uses AdventureWorks
SELECT FirstName, LastName, Phone
FROM DimEmployee
WHERE phone LIKE '6_2%'
ORDER by LastName;
Lihat juga
PATINDEX (SQL bertransaksi)
Ekspresi (SQL Bertransaksi)
Fungsi Bawaan (SQL Transact)
SELECT (Transact-SQL)
WHERE (SQL Bertransaksi)
