LIKE (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)Titik akhir analitik SQL di Microsoft FabricWarehouse 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.

Konvensi sintaks transact-SQL

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).

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

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, , LarsenKarsen, 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

LIKEmengembalikan 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 adalah hasil yang ditetapkan.

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 adalah hasil yang ditetapkan.

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 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. 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 2DimEmployee 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;

Baca juga