45-Mavzu: IN, LIKE operatorlari Reja: 1. Transact-SQL-dagi sintaksis belgilari 2. Sintaksis 3. ESCAPE va STRING_ESCAPE Belgilangan belgilar qatori belgilangan naqshga mos kelishini aniqlaydi. Shakl oddiy belgilar va joker belgilarni o'z ichiga olishi mumkin. Naqshga mos kelganda, uning oddiy belgilari satrda ko'rsatilgan belgilarga to'liq mos kelishi kerak. Joker belgilar belgilar qatorining ixtiyoriy elementlariga mos kelishi mumkin. Satrni taqqoslash operatorlaridan (= va !=) farqli ravishda joker belgilardan foydalanish LIKE operatorini yanada moslashuvchan qiladi. Agar argumentlardan birining ma'lumotlar turi belgilar qatori bo'lmasa, SQL Server ma'lumotlar bazasi mexanizmi iloji bo'lsa, uni belgilar qatoriga o'zgartiradi.
Transact-SQL-dagi sintaksis belgilari
Sintaksis
syntaxsqlNusxalash
-- Syntax for SQL Server and Azure SQL Database
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
syntaxsqlNusxalash
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse
match_expression [ NOT ] LIKE pattern
Eslatma
ESCAPE va STRING_ESCAPE hozirda Azure Synapse Analytics va Analytics Platform System (PDW) da qo‘llab-quvvatlanmaydi.
Eslatma
SQL Server 2014 va undan oldingi versiyalar uchun Transact-SQL sintaksisi tavsifiga havolalar uchun oldingi versiyalar uchun hujjatlarga qarang .
Argumentlar
match_expression
Har qanday joriy belgi ma'lumotlar turi ifodasi .
naqsh match_expression
da izlash uchun maxsus belgilar qatori quyidagi haqiqiy joker belgilarni o'z ichiga olishi mumkin. Naqsh qiymatining uzunligi 8000 baytdan oshmasligi kerak.
joker belgi
Tavsif
Misol
%
Nol yoki undan ortiq belgilarni o'z ichiga olgan har qanday qator.
WHERE bandi Title LIKE '%computer%' "kompyuter" so'zini o'z ichiga olgan barcha kitob sarlavhalarini qidiradi va qaytaradi.
_ (pastki chiziq)
Har qanday bitta belgi.
WHERE iborasi muallif_familiyasi LIKE "_petrov" "etrov" bilan tugaydigan olti harfli barcha nomlarni qidiradi va qaytaradi (Petrov, Vetrov va boshqalar).
[ ]
([af]) yoki to'plamdagi ([abcdef]) har qanday bitta belgi.
WHERE iborasi Author_Lastname LIKE '[L-S]ohms' barcha mualliflarning familiyasini "ohm" bilan tugaydigan va "L" va "S" orasidagi har qanday harf bilan boshlangan Lomov, Romov, Somov va boshqalarni qidiradi va qaytaradi. P. . Qidiruv operatsiyasini diapazonda amalga oshirganingizda, diapazonga kiritilgan belgilar saralashning tartiblash qoidalariga qarab o'zgarishi mumkin.
[^]
([^af]) yoki toʻplamda ([^abcdef]) mavjud boʻlmagan har qanday bitta belgi.
WHERE bayonoti Author_Lastname LIKE 'iv[^a]%' 'ive' bilan boshlangan va 'a'dan boshqa uchinchi harfga ega bo'lgan barcha familiyalarni qidiradi va qaytaradi.
escape_character Joyker
belgisi oldiga qo'yilgan belgi, shunday qilib joker belgi joker belgi sifatida emas, oddiy belgi sifatida ko'rib chiqiladi. Escape_character argumenti standart qiymatga ega bo'lmagan va natijani bitta belgi sifatida qaytaradigan belgi ifodasidir.
Natija turlari
Mantiqiy
Natija qiymati
Agar match_expression argumenti belgilangan naqsh argumentiga mos kelsa, LIKE operatori TRUE qiymatini qaytaradi .
Izohlar
Satrlarni solishtirish uchun LIKE operatoridan foydalanganda naqsh qatoridagi barcha belgilar hisobga olinadi. Muhim belgilar, shuningdek, oldingi va keyingi bo'shliqlarni ham o'z ichiga oladi. Agar so'rovdagi taqqoslash operatsiyasi "abc" (oxirida bo'sh joy belgisi bilan) LIKE satrlarini o'z ichiga olgan barcha satrlarni qaytarishi kerak bo'lsa, "abc" (bo'sh joysiz) o'z ichiga olgan satr qaytarilmaydi. Biroq, naqsh solishtiriladigan iboradagi keyingi bo'shliqlar e'tiborga olinmaydi. Agar so'rovdagi taqqoslash operatsiyasi "abc" LIKE satrlarini o'z ichiga olgan barcha satrlarni qaytarishi kerak bo'lsa (orqadagi bo'sh joy belgisisiz), u holda "abc" ni o'z ichiga olgan barcha qatorlar orqa bo'shliqlar bilan yoki bo'sh joysiz qaytariladi.
Char va varchar ma'lumotlar turlarini o'z ichiga olgan naqsh yordamida LIKE operatori yordamida satrlarni taqqoslashda har bir ma'lumot turini saqlash usullari tufayli muammolar paydo bo'lishi mumkin. Quyidagi misol mahalliy char o'zgaruvchisini saqlangan protseduraga o'tkazadi va keyin familiyalari belgilangan harflar ketma-ketligi bilan boshlanadigan barcha xodimlarni topish uchun naqsh mosligini ishlatadi.
SQLNusxalash
-- 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
Protsedurani bajarish FindEmployeemuvaffaqiyatsiz tugadi, chunki char ( @EmpLName) o'zgaruvchisi har doim 20 ta belgidan iborat bo'lib, orqa bo'shliqlar bilan to'ldirilgan. Ustundagi o'zgaruvchilar varcharLastName turiga ega . Shuning uchun, orqadagi bo'shliqlar ularga qo'shilmaydi. Ushbu protsedura bajarilmaydi, chunki keyingi bo'shliqlar hisobga olinadi.
Quyidagi misoldagi protsedura muvaffaqiyatli bo'ladi, chunki varchar o'zgaruvchisiga hech qanday keyingi bo'shliqlar qo'shilmaydi .
SQLNusxalash
-- 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';
Natijalar to'plami:
Nusxalash
FirstName LastName City
---------- -------------------- ---------------
Angela Barbariol Snohomish
David Barber Snohomish
(2 row(s) affected)
LIKE operatori yordamida naqsh moslashtirish
LIKE operatori ASCII va Unicode naqshlarini qo'llab-quvvatlaydi. Agar barcha argumentlar ( match_expression , pattern va escape_character , agar ko'rsatilgan bo'lsa) ASCII belgilar turiga tegishli bo'lsa, ASCII naqsh qo'llaniladi. Agar biron bir argument Unicode ma'lumotlar turiga tegishli bo'lsa, barcha argumentlar Unicode'ga aylantiriladi va Unicode naqshlari qo'llaniladi. Agar siz LIKE operatoridan Unicode ma'lumotlar turi ( nchar yoki nvarchar ) bilan foydalansangiz, boshqa Unicode bo'lmagan ma'lumotlar turlaridan farqli o'laroq, keyingi bo'shliqlar hisobga olinadi. LIKE operatorining Unicode ma'lumotlari bilan ishlashi ISO standartiga mos keladi. LIKE operatorining ASCII ma'lumotlari bilan ishlash usuli SQL Serverning oldingi versiyalari bilan mos keladi.
Quyidagi misollar Unicode va ASCII da taqdim etilgan LIKE operator naqshlari bilan ma'lumotlarni solishtirish natijalari o'rtasidagi farqni tushuntiradi.
SQLNusxalash
-- 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
Eslatma
LIKE operatoridan foydalangan holda taqqoslash operatsiyalari solishtirishga bog'liq. Qo'shimcha ma'lumot uchun COLLATE (Transact-SQL) ga qarang .
"%" joker belgisidan foydalanish
LIKE operatorida "5%" belgisini belgilasangiz, Ma'lumotlar bazasi mexanizmi "5" raqamidan so'ng nol yoki undan ortiq belgilarga ega bo'lgan har qanday qatorni qidiradi.
Misol uchun, quyidagi misolni ishga tushirish AdventureWorks2012 ma'lumotlar bazasidagi barcha DMVlarni ko'rsatadi, chunki ularning barchasi bilan boshlanadi dm.
SQLNusxalash
-- Uses AdventureWorks
SELECT Name
FROM sys.system_views
WHERE Name LIKE 'dm%';
GO
DMV bo'lmagan barcha ob'ektlarni ko'rsatish uchun dan foydalaning NOT LIKE 'dm%'. Masalan, jami 32 ta ob'ekt bo'lsa va LIKE operatori naqshga mos keladigan 13 ta elementni qaytarsa, NOT LIKE operatori LIKE operatorida ko'rsatilgan naqshga mos kelmaydigan 19 ta ob'ektni qaytaradi.
Bunday naqsh LIKE '[^d][^m]%'har doim ham bir xil nomlarni qaytarmaydi. 19 ta ism oʻrniga faqat 14 tasini topish mumkin, chunki harf bilan boshlangan dyoki ikkinchi harfi boʻlgan mismlar, DMV nomlari kabi natijadan chiqarib tashlanadi. Hodisaga bunday munosabatning sababi salbiy joker belgilarni bosqichma-bosqich qidirish: bitta joker belgi bir bosqichda qayta ishlanadi. Muvofiqlashtirish jarayoni bajarilishning istalgan bosqichida nosozlik yuzaga kelganda tugatiladi.