Pilih sesuatu yang memiliki karakter lebih / kurang dari x

109

Ingin tahu apakah mungkin untuk memilih sesuatu yang memiliki lebih / kurang dari x karakter dalam SQL.

Misalnya, saya memiliki tabel karyawan dan saya ingin menampilkan semua nama karyawan yang memiliki lebih dari 4 karakter dalam namanya.

Berikut adalah tabel contoh

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

Jawaban:

181

Jika Anda menggunakan SQL Server, Gunakan fungsi LEN(Panjang):

SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4

MSDN untuk itu menyatakan:

Mengembalikan jumlah karakter dari ekspresi string yang ditentukan,
tidak termasuk tanda kosong.

Berikut link ke MSDN

Untuk oracle / plsql yang bisa Anda gunakan Length(), mysql juga menggunakan Length.

Berikut adalah dokumentasi Oracle:

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

Dan inilah Dokumentasi mySQL tentang Length(string):

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

Untuk PostgreSQL, Anda dapat menggunakan length(string)atau char_length(string). Berikut adalah dokumentasi PostgreSQL:

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

JonH
sumber
1
Untuk ketidaksetaraan majemuk, cukup tambahkan ANDpernyataan- misalnya SELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;
alexanderjsingleton
28

JonH telah membahas dengan sangat baik bagian tentang bagaimana menulis query. Namun, ada masalah signifikan lain yang harus disebutkan juga, yang merupakan karakteristik kinerja kueri tersebut. Mari ulangi di sini (disesuaikan dengan Oracle):

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

Kueri ini membatasi hasil dari fungsi yang diterapkan ke nilai kolom (hasil penerapan LENGTHfungsi ke EmployeeNamekolom). Di Oracle, dan mungkin di semua RDBMS lainnya, ini berarti indeks reguler pada EmployeeName tidak akan berguna untuk menjawab pertanyaan ini; database akan melakukan pemindaian tabel lengkap, yang bisa sangat mahal.

Namun, berbagai database menawarkan fitur indeks fungsi yang dirancang untuk mempercepat kueri seperti ini. Misalnya, di Oracle, Anda dapat membuat indeks seperti ini:

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

Ini mungkin masih tidak membantu dalam kasus Anda, karena indeks mungkin tidak terlalu selektif untuk kondisi Anda. Maksud saya sebagai berikut: Anda meminta baris yang panjang namanya lebih dari 4. Mari kita asumsikan bahwa 80% dari nama karyawan dalam tabel itu lebih panjang dari 4. Nah, maka database kemungkinan akan menyimpulkan ( dengan benar) bahwa tidak ada gunanya menggunakan indeks, karena itu mungkin harus membaca sebagian besar blok dalam tabel.

Namun, jika Anda mengubah kueri menjadi LENGTH(EmployeeName) <= 4, atau LENGTH(EmployeeName) > 35, dengan asumsi bahwa sangat sedikit karyawan yang memiliki nama kurang dari 5 karakter atau lebih dari 35, maka indeks akan dipilih dan meningkatkan kinerja.

Singkatnya: waspadalah terhadap karakteristik kinerja kueri seperti yang Anda coba tulis.

Luis Casillas
sumber
5

Hari ini saya mencoba yang sama di db2 dan digunakan di bawah ini, dalam kasus saya, saya memiliki spasi di akhir data kolom varchar

PILIH EmployeeName DARI EmployeeTable WHERE LENGTH (TRIM (EmployeeName))> 4;

Vipin
sumber
0

Jika Anda mengalami masalah yang sama saat membuat kueri database DB2, Anda harus menggunakan kueri di bawah ini.

SELECT * 
FROM OPENQUERY(LINK_DB,'SELECT
CITY,
cast(STATE as varchar(40)) 
FROM DATABASE')
Jelani
sumber