LIKE (Transact-sql)
Belirli bir karakter dizesinin belirtilen desenle eşleşip eşleşmediğini belirler. Desen, normal karakterleri veya joker karakterleri içerebilir. Desen eşleştirme sırasında, normal karakterlerin karakter dizesinde belirtilen karakterlerle tam olarak eşleşmesi gerekir. Ancak joker karakterler, karakter dizesinin isteğe bağlı parçalarıyla eşleşebilir. Joker karakterleri kullanmak, BENZER işlecini = ve != dize karşılaştırma işleçlerini kullanmaya göre daha esnek yapar. Herhangi bir bağımsız değişken karakter dizesi veri türü, değilse SQL Server Veritabanı AltyapısıMümkünse o karakter dizesi veri türü için dönüştüren.
Transact-SQL Sözdizim Kuralları
Sözdizimi
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
Bağımsız değişkenler
match_expression
Herhangi bir geçerli ifade karakter veri türü.pattern
Belirli dize içinde aramak için karakter match_expressionve geçerli joker karakterlerini içerebilir. patternen çok 8.000 bayt olabilir.Joker karakter
Açıklama
Örnek
%
Sıfır veya daha fazla karakterli herhangi bir dize.
YERİ 'bilgisayar % gibi' title tüm kitap başlıkları 'bilgisayar' sözcüğü bulur her yerde kitap başlığı.
_ (alt çizgi)
Herhangi bir tek karakter.
where au_fname gibi '_ean' tüm dört harfli ilk isimleri ile ean (Dean, Sean vb.) son bulur.
[ ]
Herhangi bir tek karakter belirtilen aralık içinde ([a-f]) veya ([abcdef]) ayarlayın.
where au_lname '[c-p] arsen' gibi buluntular arsen ile biten ve örneğin Carsen, Larsen, Karsen, c ve p, arasında herhangi bir tek karakterle başlayan soyadları yazar ve benzeri. Aralığı aramalara aralığa dahil karakterleri harmanlamayı sıralama kurallarına bağlı olarak değişebilir.
[^]
Herhangi bir tek karakter belirtilen aralık içinde ([^ a-f]) veya ayarlayın ([^ abcdef]).
where au_lname gibi ' de [^ l] %' tüm soyadlarını de ve aşağıdaki mektup l olmadığı itibaren yazar.
escape_character
Joker karakteri normal karakter olarak ve bir joker olarak yorumlanmalıdır belirtmek için joker karakter önünde koymak bir karakterdir. escape_characterhiçbir varsayılan vardır ve yalnızca bir karakter değerlendirmelidir karakter ifade iş.
Sonuç türleri
Boolean
Sonuç değeri
GİBİ true döndürür match_expressionbelirtilen eşleşen pattern.
Açıklamalar
Tüm karakterlerin desen dizesi önemli gibi ne zaman sen dize karşılaştırmaları kullanarak gerçekleştirin. Bu, başta ve sonda boşluk içerir. Eğer sorguda karşılaştırma 'abc' gibi bir dize içeren tüm satırları döndürmek için (abc ardından tek bir boşlukla), bu sütunun değeri abc (bir boşluk bırakmazsanız abc) olan bir satır döndürülmez. Ancak ifade için desen eşleştirilir, izleyen boşluklar göz ardı edilir. Eğer sorguda karşılaştırma 'abc' gibi dize içeren tüm satırları döndürmek için bir boşluk bırakmazsanız (abc), abc ile başlayan ve sondaki boşlukları sıfır veya daha fazla olan tüm satır döndürülür.
İçeren bir model kullanarak bir dize karşılaştırma charve varcharveri değil geçmek LIKE verileri nasıl depolandığını yüzünden. Her veri depolama anlamalıdır türü ve nerede LIKE başarısız olabilir. Aşağıdaki örnek yerel geçer chardeğişken için bir saklı yordam ve ardından kullandığı desen eşleştirme çalışanları olan son adları start ile belirtilen karakter kümesini bulmak için.
USE AdventureWorks2012;
GO
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
USE AdventureWorks2012;
GO
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
De FindEmployeeyordamı, hiçbir satır döndürdü çünkü chardeğişken (@EmpLName) adı az 20 karakter içeren her sondaki boşlukları içermektedir. Çünkü LastNamesütun varchar, hiçbir sondaki boşlukları vardır. Sondaki boşlukları önemli bu yordamı başarısız olur.
Ancak, aşağıdaki örnek başarılı, sondaki boşluklar eklenir değil çünkü bir varchardeğişkeni.
USE AdventureWorks2012;
GO
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';
USE AdventureWorks2012;
GO
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';
Sonuç kümesi buradadır.
FirstName LastName City
---------- ----------------------------------------
Angela Barbariol Snohomish
David Barber Snohomish
(2 row(s) affected)
Desen eşleştirme kullanarak gibi
Destekler ASCII desen eşleştirme ve Unicode dize kalıbı gibi. Ne zaman tüm değişkenleri (match_expression, pattern, ve escape_character, varsa) ASCII karakter veri türleri, ASCII desen eşleştirme gerçekleştirilir. Herhangi bir bağımsız değişken Unicode veri türü varsa, tüm bağımsız değişkenler için Unicode dönüştürülür ve Unicode dize kalıbı gerçekleştirilir. Unicode verilerini kullandığınızda ( nchar ya nvarcharveri türleri) ile benzeri, sondaki boşlukları önemli; Ancak, Unicode olmayan veri için sondaki boşlukları önemli değildir. Unicode gibi standart ISO ile uyumludur. ASCII gibi önceki sürümleri ile uyumlu SQL Server.
Bir dizi ASCII ve Unicode gibi desen eşleştirme arasında döndürülen satır farklılıkları gösteren örnekler aşağıdadır.
-- 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
-- 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
[!NOT]
Karşılaştırma gibi harmanlama tarafından etkilenir. Daha fazla bilgi için, bkz. HARMANLAMA (Transact-sql).
% Joker karakter kullanma
Eğer gibi ' 5 %' sembol belirtilirse, Veritabanı Altyapısı5 numarayı arar takip herhangi bir sıfır veya daha fazla karakter dizesiyle.
Örneğin, aşağıdaki sorgu tüm dinamik yönetimi görünümleri gösterir AdventureWorks2012 veritabanı, çünkü hepsi harfleriyle başlar, dm.
USE AdventureWorks2012;
GO
SELECT Name
FROM sys.system_views
WHERE Name LIKE 'dm%';
GO
USE AdventureWorks2012;
GO
SELECT Name
FROM sys.system_views
WHERE Name LIKE 'dm%';
GO
Dinamik yönetimi görünümleri olmayan tüm nesneleri görmek için NOT LIKE 'dm%'. Eğer sen-si olmak a toplam-in 32 nesneleri bulur gibi değil 19 nesneleri bulur gibi desenle eşleşen 13 LIKE desen adlarıyla.
Siz her zaman aynı adları ile desen gibi bulamayabilir LIKE '[^d][^m]%'. 19 Adları yerine, sen-ebilmek bulmak tüm adları ile başlayan sadece 14 dya da msonuçları ve dinamik yönetimi görünüm adları ortadan ikinci harfi olarak. Bunun nedeni, negatif joker karakter dizeleriyle maç adımda, bir defada bir joker karakter değerlendirilir. Maçın değerlendirmesini herhangi bir noktada başarısız olursa, bunu ortadan kalkar.
Hazır bilgi olarak joker karakterler kullanma
Joker desen eşleştirme karakterleri değişmez karakter olarak kullanabilirsiniz. Joker karakter harf karakter olarak kullanmak için joker karakter parantez içine alın. LIKE anahtar sözcüğünü ve [] joker karakterler kullanarak çeşitli örnekler aşağıdaki tabloda gösterilmektedir.
Simge |
Anlamı |
---|---|
'5 GİBİ [%]' |
5% |
'[_] N gibi' |
_n |
'[A-cdf gibi]' |
a, b, c, d veya f |
GİBİ ' [-acdf]' |
-, a, c, d veya f |
'[' GİBİ |
[ |
GİBİ ']' |
] |
Abc [_] d LIKE '%' |
abc_d ve abc_de |
'Abc gibi [def]' |
ABCD, abce ve abcf |
Desen ESCAPE yan tümcesi ile eşleştirme
Bir veya daha fazla özel joker karakterler içeren karakter dizeleri için arama yapabilirsiniz. Örneğin, discountstablo içinde bir customersveritabanı yüzde işareti (%) içeren iskonto değerleri saklamak. Joker karakter olarak bir karakter yerine yüzde işareti aramak için kaçış kelime ve çıkış karakteri sağlanmalıdır. Örneğin, adlı bir sütun bir sample veritabanı içerir comment% 30 metni içeren. % 30 Yerde dizesini içeren tüm satırları aramak için commentsütun gibi bir where yan tümcesi belirtin, WHERE comment LIKE '%30!%%' ESCAPE '!'. KAÇIŞ ve çıkış karakteri belirtilmezse, Veritabanı Altyapısı30 dize içeren tüm satırları verir.
Yoksa hiçbir karakter sonra çıkış karakteri gibi desene, desen geçerli değil ve benzeri false döndürür. Karakterin arkasına bir kaçış karakterini joker karakter değilse, çıkış karakteri atılır ve aşağıdaki kaçış karakteri şablondaki normal karakter olarak ele alınır. Bu, yüzde işareti (%) içerir, alt çizgi (_) ve çift köşeli ayraç ([]) içine alınır köşeli ayraç ([]) joker karakter bıraktı. Ayrıca, çift köşeli ayraç karakterleri ([]) içinde çıkış karakterleri kullanılabilir çıkıntı işareti (^), kısa çizgi (-) ve sağ köşeli ayraç (]) kaçtı.
0x0000 (char(0)) Windows harmanlamaları tanımsız bir karakterdir ve benzeri içinde eklenemez.
Örnekler
A.% Joker karakterini kullanarak gibi
Aşağıdaki örnek, alan koduna sahip tüm telefon numaralarını bulur 415de PersonPhonetablosu.
USE AdventureWorks2012;
GO
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
USE AdventureWorks2012;
GO
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
Sonuç kümesi buradadır.
FirstName LastName phone
----------------- ---------------- ------------
Ruben Alonso 415-555-0124
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.not LIKE % joker karakter ile kullanma
Aşağıdaki örnek, tüm telefon numaraları bulur PersonPhoneTablo Alan kodları dışındaki var 415.
USE AdventureWorks2012;
GO
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
USE AdventureWorks2012;
GO
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
Sonuç kümesi buradadır.
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.ESCAPE yan tümcesi kullanarak
Aşağıdaki örnek ESCAPEyan tümcesi ve tam karakter dizesini bulmak için kaçış karakteri 10-15%sütununda c1, mytbl2tablosu.
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');
INSERT mytbl2 VALUES ('Discount is .10-.15 off');
GO
SELECT c1
FROM mytbl2
WHERE c1 LIKE '%10-15!% off%' ESCAPE '!';
GO
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');
INSERT mytbl2 VALUES ('Discount is .10-.15 off');
GO
SELECT c1
FROM mytbl2
WHERE c1 LIKE '%10-15!% off%' ESCAPE '!';
GO
D.[] Joker karakterler kullanma
Aşağıdaki örnek, çalışanlar üzerinde bulur Persontablo adı ile Cherylya Sheryl.
USE AdventureWorks2012;
GO
SELECT BusinessEntityID, FirstName, LastName
FROM Person.Person
WHERE FirstName LIKE '[CS]heryl';
GO
USE AdventureWorks2012;
GO
SELECT BusinessEntityID, FirstName, LastName
FROM Person.Person
WHERE FirstName LIKE '[CS]heryl';
GO
Aşağıdaki örnek, çalışanlar için satırları bulur Personsoyadlarını içeren tablo Zhengya Zhang.
USE AdventureWorks2012;
GO
SELECT LastName, FirstName
FROM Person.Person
WHERE LastName LIKE 'Zh[ae]ng'
ORDER BY LastName ASC, FirstName ASC;
GO
USE AdventureWorks2012;
GO
SELECT LastName, FirstName
FROM Person.Person
WHERE LastName LIKE 'Zh[ae]ng'
ORDER BY LastName ASC, FirstName ASC;
GO