X karakterinden fazla / küçük olan bir şey seçin


109

SQL'de x'ten fazla / az karakter içeren bir şey seçmenin mümkün olup olmadığını merak ediyordum.

Örneğin, bir çalışan tablom var ve adlarında 4 karakterden fazla olan tüm çalışan adlarını göstermek istiyorum.

İşte örnek bir tablo

ID EmpName Dept
1  Johnny  ACC
2  Dan     IT
3  Amriel  PR
4  Amy     HR

Yanıtlar:


182

SQL Server kullanıyorsanız, LEN(Uzunluk) işlevini kullanın :

SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4

Bunun için MSDN şunları belirtir:


Sondaki boşluklar hariç , belirtilen dize ifadesinin karakter sayısını döndürür .

İşte MSDN bağlantısı

Oracle / plsql için kullanabilirsiniz Length(), mysql ayrıca Length'i kullanır.

Oracle belgeleri şu şekildedir:

http://www.techonthenet.com/oracle/functions/length.php

Ve işte mySQL Belgeleri Length(string):

http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_length

PostgreSQL için length(string)veya kullanabilirsiniz char_length(string). İşte PostgreSQL belgeleri:

http://www.postgresql.org/docs/current/static/functions-string.html#FUNCTIONS-STRING-SQL


1
Bileşik eşitsizlikler için basitçe bir ANDifade ekleyin SELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;
alexanderjsingleton

28

JonH, sorgunun nasıl yazılacağıyla ilgili kısmı çok iyi ele aldı. Bununla birlikte, bahsedilmesi gereken önemli bir konu daha var, bu tür bir sorgunun performans özellikleri. Burada tekrarlayalım (Oracle'a uyarlanmıştır):

SELECT EmployeeName FROM EmployeeTable WHERE LENGTH(EmployeeName) > 4;

Bu sorgu, engel olup bir sütun değere tatbik edilen bir fonksiyonun sonucunu (uygulanması sonucu LENGTHfonksiyonu EmployeeNamekolon). Oracle'da ve muhtemelen diğer tüm RDBMS'lerde bu, EmployeeName üzerinde düzenli bir dizinin bu sorguyu yanıtlamak için işe yaramayacağı anlamına gelir; veritabanı, gerçekten maliyetli olabilecek tam bir tablo taraması yapacaktır.

Bununla birlikte, çeşitli veritabanları, bunun gibi sorguları hızlandırmak için tasarlanmış bir işlev dizini özelliği sunar . Örneğin, Oracle'da şöyle bir dizin oluşturabilirsiniz:

CREATE INDEX EmployeeTable_EmployeeName_Length ON EmployeeTable(LENGTH(EmployeeName));

Yine de bu durum sizin durumunuzda yardımcı olmayabilir, çünkü indeks durumunuz için çok seçici olmayabilir. Bununla şunu kastediyorum: Adın uzunluğunun 4'ten fazla olduğu satırları soruyorsunuz. Bu tablodaki çalışan adlarının% 80'inin 4'ten daha uzun olduğunu varsayalım. O zaman veritabanı muhtemelen son bulacaktır ( doğru), indeksi kullanmaya değmeyecektir, çünkü muhtemelen tablodaki blokların çoğunu okumak zorunda kalacak.

Ancak, sorguyu söyleyecek şekilde değiştirirseniz LENGTH(EmployeeName) <= 4veya LENGTH(EmployeeName) > 35çok az çalışanın 5 karakterden az veya 35'ten fazla adlara sahip olduğunu varsayarak, dizin seçilir ve performansı artırır.

Neyse, kısaca: yazmaya çalıştığınız sorgu gibi sorguların performans özelliklerine dikkat edin.


5

Bugün aynısını db2'de deniyordum ve aşağıda kullandım, benim durumumda varchar sütun verilerinin sonunda boşluklar vardı

ÇalışanAdı'nı ÇalışanTablosundan SEÇİN UZUNLUK (TRIM (Çalışan Adı))> 4;


0

Bir DB2 veritabanını sorgularken aynı sorunu yaşıyorsanız, aşağıdaki sorguyu kullanmanız gerekir.

SELECT * 
FROM OPENQUERY(LINK_DB,'SELECT
CITY,
cast(STATE as varchar(40)) 
FROM DATABASE')
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.