"Where" deyiminin büyük / küçük harf duyarlı olmadığı bir SQL sorgusu (MS SQL Sunucusu) nasıl oluşturabilirim?
SELECT * FROM myTable WHERE myField = 'sOmeVal'
Vakayı görmezden gelerek sonuçların geri gelmesini istiyorum
"Where" deyiminin büyük / küçük harf duyarlı olmadığı bir SQL sorgusu (MS SQL Sunucusu) nasıl oluşturabilirim?
SELECT * FROM myTable WHERE myField = 'sOmeVal'
Vakayı görmezden gelerek sonuçların geri gelmesini istiyorum
Yanıtlar:
Bir SQL Server veritabanının varsayılan yapılandırmasında, dize karşılaştırmaları büyük / küçük harfe duyarlı değildir. Veritabanınız bu ayarı geçersiz kılarsa (alternatif bir harmanlama kullanarak), sorgunuzda ne tür harmanlama kullanacağınızı belirtmeniz gerekir.
SELECT * FROM myTable WHERE myField = 'sOmeVal' COLLATE SQL_Latin1_General_CP1_CI_AS
Sağladığım harmanlamanın sadece bir örnek olduğunu unutmayın (yine de sizin için büyük olasılıkla gayet iyi çalışacaktır). SQL Server harmanlamalarının daha kapsamlı bir taslağı burada bulunabilir .
UPPER
veya büyük / LOWER
küçük harfe dönüştürerek daha sonra LIKE
arama yapmak için kullanarak herhangi bir performans sorunu olup olmadığını bilmek ister misiniz?
Genellikle dize karşılaştırmaları büyük / küçük harfe duyarlı değildir. Veritabanınız büyük / küçük harfe duyarlı harmanlama için yapılandırılmışsa, büyük / küçük harfe duyarlı olmayan bir tane kullanmaya zorlamanız gerekir:
SELECT balance FROM people WHERE email = 'billg@microsoft.com'
COLLATE SQL_Latin1_General_CP1_CI_AS
Başka bir yerde başka bir çözüm buldum; yani kullanmak
upper(@yourString)
ama buradaki herkes, SQL Server'da bunun önemli olmadığını çünkü durumu görmezden geliyor? Veritabanımızın büyük / küçük harfe duyarlı olduğundan oldukça eminim.
En iyi 2 cevap ( Adam Robinson ve Andrejs Cainikovs'tan ) teknik olarak işe yaradıkları için biraz doğru, ancak açıklamaları yanlış ve bu nedenle birçok durumda yanıltıcı olabilir. Örneğin, SQL_Latin1_General_CP1_CI_AS
harmanlama birçok durumda işe yarayacak olsa da, büyük / küçük harfe duyarlı olmayan uygun harmanlama olduğu varsayılmamalıdır. Aslında, OP'nin büyük / küçük harfe duyarlı (veya muhtemelen ikili) harmanlama ile bir veritabanında çalıştığı göz önüne alındığında, OP'nin pek çok kurulum için varsayılan harmanlamayı kullanmadığını biliyoruz (özellikle bir işletim sistemi ABD İngilizcesi dili gibi) kullanarak: SQL_Latin1_General_CP1_CI_AS
. Elbette, OP kullanıyor olabilirSQL_Latin1_General_CP1_CS_AS
, ancakVARCHAR
veri kaybına neden olabileceğinden ve harmanlamanın yerel ayarı / kültürü tarafından kontrol edildiği için kod sayfasını değiştirmemek önemlidir (yani Latin1_General - Fransızca - İbranice vb.). Lütfen aşağıdaki 9. maddeye bakın.
Diğer dört cevap farklı derecelerde yanlıştır.
Okuyucuların umarız en uygun / verimli seçimleri yapabilmeleri için buradaki tüm yanlış anlamaları açıklığa kavuşturacağım.
Kullanmayın UPPER()
. Bu tamamen gereksiz fazladan iştir. Bir COLLATE
cümle kullanın . Her iki durumda da bir dize karşılaştırmasının yapılması gerekir, ancak kullanılması UPPER()
aynı zamanda büyük harf eşlemesinin olup olmadığını görmek için karakter karakter de kontrol etmeli ve sonra değiştirmelidir. Ve bunu her iki tarafta da yapmanız gerekiyor. Ekleme COLLATE
, işlemi varsayılan olarak yapacağından farklı bir kurallar kümesi kullanarak sıralama anahtarlarını oluşturmaya yönlendirir. Bu test komut dosyasında (PasteBin'de) kanıtlandığı COLLATE
gibi kullanmak , kullanmaktan kesinlikle daha etkilidir (veya bu kelimeyi seviyorsanız "performans" ) .UPPER()
@Ceisc tarafından @ Danny'nin cevabında not edilen sorun da var:
Bazı dillerde, dönüşümler gidiş-dönüş değildir. yani DÜŞÜK (x)! = DÜŞÜK (ÜST (x)).
Türkçe büyük harf "İ" ortak bir örnektir.
Hayır, harmanlama, en azından bu bağlamda veritabanı çapında bir ayar değildir. Veritabanı düzeyinde bir varsayılan harmanlama vardır ve bu, COLLATE
cümleyi belirtmeyen değiştirilmiş ve yeni oluşturulmuş sütunlar için varsayılan olarak kullanılır (muhtemelen bu yaygın yanlış anlamanın geldiği yerdir), ancak siz olmadığınız sürece sorguları doğrudan etkilemez. dize değişmezlerini ve değişkenlerini diğer dize değişmezleri ve değişkenleriyle karşılaştırma veya veritabanı düzeyinde meta verileri referans veriyorsunuz.
Hayır, harmanlama sorgu başına değildir.
Harmanlamalar, sorgu başına değil, yüklem (yani işlenen bir şey) veya ifade başınadır. Ve bu sadece WHERE
cümle için değil, tüm sorgu için geçerlidir . Bu, JOIN, GROUP BY, ORDER BY, PARTITION BY, vb. Kapsar.
Hayır, aşağıdaki nedenlerden ötürü VARBINARY
(örn. convert(varbinary, myField) = convert(varbinary, 'sOmeVal')
) 'E dönüştürmeyin :
_BIN2
SQL Server 2008 veya daha yenisini kullanıyorsanız ile biten birini kullanın, aksi takdirde ile biten birini kullanmaktan başka seçeneğiniz yoktur _BIN
. Verilerse, NVARCHAR
o zaman hangi yerel ayarı kullandığınız önemli değildir, çünkü bu durumda hepsi aynıdır, bu nedenle Latin1_General_100_BIN2
her zaman işe yarar . Veri ise VARCHAR
, veri (örneğin şu anda aynı yerel kullanmalıdır Latin1_General
, French
, Japanese_XJIS
yerel kullanılan kod sayfasını belirler ve kod sayfalarını değişen verileri (yani veri kaybı) değiştirebilir çünkü, vs).CONVERT()
30 varsayılan değeri kullanacaktır. Tehlike, dizge 30 bayttan fazla olabilirse, sessizce kesilecek ve muhtemelen bu yüklemden yanlış sonuçlar alacaksınız.Hayır, LIKE
her zaman büyük / küçük harfe duyarlı değildir. Başvurulan sütunun harmanlamasını veya bir değişken bir değişmez dize ile karşılaştırılırsa veritabanının harmanlamasını veya isteğe bağlı COLLATE
cümle ile belirtilen harmanlamayı kullanır .
LCASE
bir SQL Server işlevi değildir. Oracle veya MySQL gibi görünüyor. Veya muhtemelen Visual Basic?
Sorunun bağlamı, bir sütunu bir dizge ile karşılaştırdığı için, ne örneğin harmanlaması (genellikle "sunucu" olarak adlandırılır) ne de veritabanının harmanlaması burada herhangi bir doğrudan etkiye sahip değildir . Harmanlamalar her sütun için saklanır ve her sütun farklı bir harmanlamaya sahip olabilir ve bu harmanlamaların veritabanının varsayılan harmanlaması veya örneğin harmanlamasıyla aynı olması gerekmez. Elbette, örnek harmanlama, yeni oluşturulan bir veritabanının, veritabanı oluşturulurken COLLATE
yan tümce belirtilmemişse varsayılan harmanlama olarak kullanacağı şey için varsayılan değerdir . Ve benzer şekilde, veritabanının varsayılan harmanlaması, değiştirilmiş veya yeni oluşturulan bir sütunun, COLLATE
madde belirtilmemişse kullanacağı şeydir .
Aksi takdirde sütunun harmanlamasıyla aynı olan, büyük / küçük harfe duyarlı olmayan harmanlamayı kullanmalısınız. Sütunun harmanlamasını bulmak için aşağıdaki sorguyu kullanın (tablonun adını ve şema adını değiştirin):
SELECT col.*
FROM sys.columns col
WHERE col.[object_id] = OBJECT_ID(N'dbo.TableName')
AND col.[collation_name] IS NOT NULL;
Sonra sadece değiştirmek _CS
olmak _CI
. Böylece Latin1_General_100_CS_AS
olur Latin1_General_100_CI_AS
.
Sütun ikili harmanlama kullanıyorsa ( _BIN
veya ile biten _BIN2
), aşağıdaki sorguyu kullanarak benzer bir harmanlama bulun:
SELECT *
FROM sys.fn_helpcollations() col
WHERE col.[name] LIKE N'{CurrentCollationMinus"_BIN"}[_]CI[_]%';
Örneğin, sütunun kullandığını varsayarsak, şunu yapın Japanese_XJIS_100_BIN2
:
SELECT *
FROM sys.fn_helpcollations() col
WHERE col.[name] LIKE N'Japanese_XJIS_100[_]CI[_]%';
Harmanlamalar, kodlamalar vb. Hakkında daha fazla bilgi için lütfen şu adresi ziyaret edin: Harmanlama Bilgileri
Hayır, sadece kullanmak LIKE
işe yaramayacaktır. LIKE
Verdiğiniz kalıpla tam olarak eşleşen değerleri arar. Bu durumda LIKE
, "someval" değil, yalnızca "sOmeVal" metni bulunur.
Pratik bir çözüm işlevi kullanıyor LCASE()
. LCASE('sOmeVal')
metninizin küçük harfli dizesini alır: 'someval'. Karşılaştırmanızın her iki tarafı için bu işlevi kullanırsanız, çalışır:
SELECT * FROM myTable WHERE LCASE(myField) LIKE LCASE('sOmeVal')
İfade, iki küçük harf dizgisini karşılaştırır, böylece 'sOmeVal' değeriniz diğer tüm 'someval' gösterimleriyle eşleşir (örn. 'Someval', 'sOMEVAl' vb.).
LCASE()
SQL Server'da olduğunu sanmıyorum (en azından görebildiğim kadarıyla). Bu cevabın tamamen farklı bir RDBMS için olduğunu düşünüyorum. Bakınız Cevabımı dize karşılaştırmaları üzerine açıklama.
Büyük / küçük harfe duyarlı olanı böyle bir değişken ikilisine çevirerek zorlayabilirsiniz:
SELECT * FROM myTable
WHERE convert(varbinary, myField) = convert(varbinary, 'sOmeVal')
Hangi veritabanındasın? MS SQL Server ile bu, veritabanı çapında bir ayardır veya COLLATE anahtar sözcüğüyle sorgu başına bunu geçersiz kılabilirsiniz.
WHERE
ifadenin sonuna bir kez eklenmesi gerekiyor ve tümWHERE
maddeleri etkileyecek , değil mi?