SQL- Bir dize ararken durumu yoksay


131


Bir Tablo
PriceOrderShipped
PriceOrderShippedInbound
PriceOrderShippedOutbound içinde aşağıdaki verilere sahibim SQL'de

bir tabloda bir dizeyi arayan bir sorgu yazmam gerekiyor. Bir dizge ararken büyük / küçük harf kullanımını göz ardı etmelidir. Aşağıda belirtilen SQL sorgusu için

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%PriceOrder%' 

yukarıdaki tüm verileri verirken

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%Priceorder%' 

vermez.

Örneğin. "PriceOrder" veya "priceOrder" aradığımda işe yarıyor, ancak "priceorder" veya "Priceorder" çalışmıyor. COLLATE kullanarak aşağıdaki sorguyu denedim, ancak çalışmıyor. Nerede yanlış yaptığımı bana bildirin.

SELECT DISTINCT COL_NAME FROM myTable WHERE 
COL_NAME COLLATE latin1_general_cs LIKE '%Priceorder%'

Yanıtlar:


234

Bunun gibi bir şey kullanın -

SELECT DISTINCT COL_NAME FROM myTable WHERE UPPER(COL_NAME) LIKE UPPER('%PriceOrder%')

veya

SELECT DISTINCT COL_NAME FROM myTable WHERE LOWER(COL_NAME) LIKE LOWER('%PriceOrder%')

14
En iyi uygulama olarak her zaman büyük harfle yazılmış dizeleri (ÜST) karşılaştırmanız gerektiğini düşünüyorum. Google "türkçe i"
Traubenfuchs

2
Cevabınızın bir sütun değerini UPPERveya büyük / LOWERküçük harfe dönüştürerek daha sonra LIKEarama yapmak için kullanarak herhangi bir performans sorunu olup olmadığını bilmek ister misiniz?
shaijut

Aslında hem BÜYÜK hem de KÜÇÜK varyantlarını karşılaştırmanız gerekir çünkü bazı karakterler büyük harfle farklı temsillere sahipken, küçük harfle aynı gösterime sahiptir. Diğer karakterler için bunun tersi doğru olabilir. Java, büyük / küçük harfe duyarlı olmayan karşılaştırmasında ek bir toLowerCase () yapmanın nedeni olarak Gürcü alfabesinden özellikle bahseder.
Crusha K.Rol

1
Ne yazık ki, bu yaklaşım bu yazıda açıklandığı gibi tam bir tablo taramasına neden olur: alvinalexander.com/sql/… . Filtrelenen sütun UPPER / LOWER işlevi tarafından değiştirildiği için bir dizin araması uygulanamaz.
Jeff S.

Üst / alt sorgu performansı yeterli değilse, bir harmanlama (dizini oluşturmadan önce) ayarlamak daha iyi bir yaklaşım gibi görünmektedir.
Jeff S.

10

Büyük / küçük harfe duyarsızlıkla aramaya bu benzer soru ve cevaba bakın - SQL sunucusu bir where ifadesinde durumu yoksay

Şunun gibi bir şey kullanmayı deneyin:

SELECT DISTINCT COL_NAME 
FROM myTable 
WHERE COL_NAME COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%priceorder%'

işe yaramıyor Collate'ten önce SQL sorgusu düzgün şekilde bitmemiş
shockwave

@ Miguel-F .. iyi çalışıyor ama SELECT DISTINCT COL_NAME'DEN myTable WHERE COL_NAME GİBİ '% priceorder%' ile farkı, çünkü bu benim için de iyi çalışıyor ..
Jishant

Bunun yerine 'SQL_Latin1_General_Cp1_CI_AS_KI_WI' kullanmanızı tavsiye ederim. Bir arama için durum duyarlı değildir.
user8155123

10

Bunun gibi.

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME iLIKE '%Priceorder%'

Postgresql'de.


4
Bu soru sql-server olarak etiketlendiğinden postgres yanıtı alakalı değildir.
Liam

4

Muhtemelen kullanmalısın SQL_Latin1_General_Cp1_CI_AS_KI_WI harmanlamanız olarak . Sorunuzda belirttiğiniz soru kesinlikle büyük / küçük harfe duyarlıdır.

Harmanlamaların bir listesini burada görebilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.