เลือกสิ่งที่มีอักขระมากกว่า / น้อยกว่า x


109

สงสัยว่าเป็นไปได้ไหมที่จะเลือกสิ่งที่มีอักขระมากกว่า / น้อยกว่า x ใน SQL

ตัวอย่างเช่นฉันมีตารางพนักงานและฉันต้องการแสดงชื่อพนักงานทั้งหมดที่มีอักขระมากกว่า 4 ตัวในชื่อของพวกเขา

นี่คือตารางตัวอย่าง

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

คำตอบ:


182

หากคุณใช้ SQL Server ให้ใช้LENฟังก์ชัน (Length):

SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4

MSDN สำหรับมันระบุว่า:

ส่งคืนจำนวนอักขระของนิพจน์สตริงที่ระบุโดย
ไม่รวมช่องว่างต่อท้าย

นี่คือลิงค์ไปยัง MSDN

สำหรับ oracle / plsql คุณสามารถใช้ได้Length()mysql ยังใช้ Length

นี่คือเอกสาร Oracle:

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

และนี่คือเอกสาร mySQL ของLength(string):

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

สำหรับ PostgreSQL คุณสามารถใช้length(string)หรือchar_length(string). นี่คือเอกสาร PostgreSQL:

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


1
สำหรับอสมการเชิงผสมเพียงเพิ่มANDคำสั่งเช่น SELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;
alexanderjsingleton

28

JonH ได้กล่าวถึงวิธีการเขียนแบบสอบถามเป็นอย่างดี อย่างไรก็ตามมีปัญหาสำคัญอีกประการหนึ่งที่ต้องกล่าวถึงเช่นกันซึ่งเป็นลักษณะการทำงานของข้อความค้นหาดังกล่าว ขอย้ำที่นี่ (ปรับให้เข้ากับ Oracle):

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

แบบสอบถามนี้ จำกัดผลลัพธ์ของฟังก์ชันที่ใช้กับค่าคอลัมน์ (ผลของการใช้LENGTHฟังก์ชันกับEmployeeNameคอลัมน์) ใน Oracle และอาจอยู่ใน RDBMS อื่น ๆ ทั้งหมดนั่นหมายความว่าดัชนีปกติใน EmployeeName จะไม่มีประโยชน์ในการตอบคำถามนี้ ฐานข้อมูลจะทำการสแกนแบบเต็มตารางซึ่งอาจมีค่าใช้จ่ายสูงมาก

อย่างไรก็ตามฐานข้อมูลต่างๆมีคุณลักษณะดัชนีฟังก์ชันที่ออกแบบมาเพื่อเร่งความเร็วในการสืบค้นข้อมูลเช่นนี้ ตัวอย่างเช่นใน Oracle คุณสามารถสร้างดัชนีดังนี้:

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

อย่างไรก็ตามสิ่งนี้อาจยังไม่ช่วยในกรณีของคุณเนื่องจากดัชนีอาจไม่ได้รับการคัดเลือกให้เหมาะกับสภาพของคุณมากนัก ตามนี้ฉันหมายถึงสิ่งต่อไปนี้คุณกำลังถามหาแถวที่ความยาวของชื่อมากกว่า 4 สมมติว่า 80% ของชื่อพนักงานในตารางนั้นยาวกว่า 4 จากนั้นฐานข้อมูลก็น่าจะสรุปได้ ( ถูกต้อง) ว่ามันไม่คุ้มที่จะใช้ดัชนีเพราะมันอาจจะต้องอ่านบล็อคส่วนใหญ่ในตารางอยู่ดี

อย่างไรก็ตามหากคุณเปลี่ยนข้อความค้นหาเพื่อพูดLENGTH(EmployeeName) <= 4หรือLENGTH(EmployeeName) > 35สมมติว่ามีพนักงานเพียงไม่กี่คนที่มีชื่อที่มีอักขระน้อยกว่า 5 ตัวหรือมากกว่า 35 ตัวดัชนีจะถูกเลือกและปรับปรุงประสิทธิภาพ

อย่างไรก็ตามในระยะสั้น: ระวังลักษณะการทำงานของข้อความค้นหาเช่นเดียวกับที่คุณพยายามเขียน


5

วันนี้ฉันพยายามเหมือนกันใน db2 และใช้ด้านล่างในกรณีของฉันฉันมีช่องว่างที่ส่วนท้ายของข้อมูลคอลัมน์ varchar

เลือกชื่อพนักงานจาก EmployeeTable WHERE LENGTH (TRIM (EmployeeName))> 4;


0

หากคุณประสบปัญหาเดียวกันขณะสืบค้นฐานข้อมูล DB2 คุณจะต้องใช้แบบสอบถามด้านล่างนี้

SELECT * 
FROM OPENQUERY(LINK_DB,'SELECT
CITY,
cast(STATE as varchar(40)) 
FROM DATABASE')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.