문자 범위를 기반으로 문자열 필드를 선택하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/152537

문제

내 소프트웨어 사용자가 문자 범위별로 레코드를 선택할 수있는 기능을 추가해야합니다.
예를 들어 비 범위에 이름이 떨어지는 테이블의 모든 위젯을 반환하는 쿼리를 어떻게 작성할 수 있습니까?

현재 나는 연산자보다 더 크고 적은 것을 사용하고 있으므로 위의 예는 다음과 같습니다.

select * from widget
where name >= 'ba' and name < 'bj'

"자전거"가 제외되지 않도록 I에서 J 로의 마지막 캐릭터를 "증가"한 방법에 주목하십시오.

필드의 콜레이션을 기반으로 주어진 캐릭터 후에 다음 캐릭터를 찾는 일반적인 방법이 있습니까? 아니면 두 번째 조건을 만드는 것이 더 안전합니까?

select * from widget
where name >= 'ba'
and (name < 'bi' or name like 'bi%')

내 응용 프로그램은 현지화를 지원해야합니다. 이런 종류의 쿼리는 다른 문자 세트에 얼마나 민감한가?

또한 MSSQL과 Oracle을 모두 지원해야합니다. 데이터에 어떤 언어가 나타나더라도 캐릭터 케이싱이 무시되도록하는 옵션은 무엇입니까?

도움이 되었습니까?

해결책

현지화로 직접 건너 뛰자. "aa"> = "ba"라고 말할 수 있습니까? 아마도 그렇지는 않지만 스웨덴에서 분류하는 곳입니다. 또한, 당신은 단순히 어떤 언어로든 케이스를 무시할 수 있다고 가정 할 수 없습니다. 케이싱은 언어에 의존하며 가장 일반적인 예는 터키어입니다. 대문자 I입니다. 소문자 I입니다.

이제 SQL DB는 <, == 등의 결과를 "Collation Order"로 정의합니다. 이것은 확실히 언어에 따라 다릅니다. 따라서 모든 쿼리에 대해이를 명시 적으로 제어해야합니다. 터키어 콜라이트 명령은 내가 자신이 속한 곳 (터키어)을 배치 할 것입니다. 기본 Collation에 의존 할 수 없습니다.

"증분 부분"에 관해서는 귀찮게하지 마십시오. > = 및 <=에 고수하십시오.

다른 팁

MSSQL의 경우이 스레드를 참조하십시오. http://bytes.com/forum/thread483570.html .

Oracle 10의 경우 Oracle 10이 쿼리와 같은 Regex (P)를 지원하므로 Oracle 버전에 따라 다릅니다. http://www.psoug.org/reference/regexp.html (regexp_like를 검색 하고이 기사를 참조하십시오. http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html

HTH

실망스럽게도 Oracle Substring 함수는 substr ()이고 SQL-Server는 substring ()입니다.

동일한 기능 이름 + 프로토 타입을 공유 할 수 있도록 하나 또는 둘 다에 간단한 래퍼를 작성할 수 있습니다.

그런 다음 사용할 수 있습니다

MY_SUBSTRING(name, 2) >= 'ba' AND MY_SUBSTRING(name, 2) <= 'bi'

또는 유사합니다.

당신은 이것을 사용할 수 있습니다 ...

select * from widget
where name Like 'b[a-i]%'

이것은 이름이 B로 시작되는 모든 행, 두 번째 문자는 A에서 I 범위에 있으며 다른 문자는 따라갑니다.

나는 상한 끝에 고조된 현악기를 추가하는 것과 같은 단순한 것을 가지고 갈 것이라고 생각합니다. 같은 것 :

select * from widgetwhere name >= 'ba' and name <= 'bi'||'~'

그래도 EBCDIC 변환에서 살아남을 것이라고 확신합니다

당신은 다음과 같이 할 수 있습니다.

select * from widget
where left(name, 2) between 'ba' and 'bi'

기준 길이가 변경되면 (남은 주석에서 표시되는 것처럼 보이는 것처럼) 쿼리는 입력으로 길이를 가져야합니다.

declare @CriteriaLength int
set @CriteriaLength = 4
select * from widget
where left(name, @CriteriaLength) between 'baaa' and 'bike'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top