[sql] x 문자보다 많거나 적은 것을 선택하십시오.

SQL에서 x 문자보다 많거나 적은 것을 선택할 수 있는지 궁금합니다.

예를 들어, 직원 테이블이 있고 이름에 4 자 이상이 포함 된 모든 직원 이름을 표시하려고합니다.

다음은 예시 표입니다.

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



답변

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


답변

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 자 이상인 이름이 있다고 가정하면 인덱스가 선택되고 성능이 향상됩니다.

어쨌든 간단히 말해서 작성하려는 쿼리와 같은 쿼리의 성능 특성에 유의하십시오.


답변

오늘 나는 db2에서 똑같이 시도하고 아래에서 사용했습니다. 제 경우에는 varchar 열 데이터 끝에 공백이 있습니다.

EmployeeTable에서 EmployeeName 선택 WHERE LENGTH (TRIM (EmployeeName))> 4;


답변

DB2 데이터베이스를 쿼리하는 동안 동일한 문제가 발생하는 경우 아래 쿼리를 사용해야합니다.

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


답변