[sqlite] 문자열 비교시 Sqlite3를 대소 문자를 구분하지 않도록 설정하는 방법은 무엇입니까?

문자열 일치로 sqlite3 데이터베이스에서 레코드를 선택하고 싶습니다. 그러나 where 절에서 ‘=’를 사용하면 sqlite3이 대소 문자를 구분한다는 것을 알았습니다. 누구든지 대소 문자를 구분하지 않고 문자열을 사용하는 방법을 말해 줄 수 있습니까?



답변

쿼리 COLLATE NOCASE에서 사용할 수 있습니다 SELECT.

SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE

또한 SQLite에서는 collate nocase열 정의에서 지정하여 테이블을 만들 때 열이 대소 문자를 구분하지 않음을 나타낼 수 있습니다 (다른 옵션은 binary(기본값) 및rtrim ; 여기 참조 ). collate nocase인덱스를 만들 때도 지정할 수 있습니다 . 예를 들면 다음과 같습니다.

테이블 테스트 작성
(
  Text_Value 텍스트는 nocase를 조합합니다.
);

시험 값에 삽입 ( 'A');
시험 값에 삽입 ( 'b');
시험 값에 삽입 ( 'C');

인덱스 생성 Test_Text_Value_Index
  테스트 중 (Text_Value collate nocase);

관련된 표현식 Test.Text_Value은 이제 대소 문자를 구분하지 않아야합니다. 예를 들면 다음과 같습니다.

sqlite> 테스트에서 Text_Value를 선택하십시오. 여기서 Text_Value = 'B';
Text_Value
----------------
비

sqlite> Text_Value로 테스트 순서에서 Text_Value를 선택하십시오.
Text_Value
----------------
ㅏ
비
씨

sqlite> Text_Value desc로 테스트 순서에서 Text_Value를 선택하십시오.
Text_Value
----------------
씨
비
ㅏ

옵티마이 저는 또한 컬럼에서 대소 문자를 구분하지 않는 검색 및 일치를 위해 인덱스를 사용할 수 있습니다. 다음 explain과 같은 SQL 명령을 사용하여이를 확인할 수 있습니다 .

sqlite> 설명 Text_Value = 'b'테스트에서 select Text_Value를 설명하십시오.
가산기 opcode p1 p2 p3
---------------- -------------- ---------- ------------ ---------------------------------
0 고토 0 16
1 정수 0 0
2 OpenRead 1 3 키 정보 (1, NOCASE)
3 열 숫자 열 1 2
문자열 4 0 0 b
5 IsNull -1 14
6 MakeRecord 1 0 a
7 MemStore 0 0
8 이동 1 1 14
9 MemLoad 0 0
10 IdxGE 1 14 +
11 열 1 0
콜백 1 0
13 다음 1 9
14 닫기 1 0
15 정지 0 0
16 거래 0 0
17 VerifyCookie 0 4
18 고토 0 1
19 op 0 0


답변

SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE


답변

다음과 같이 할 수 있습니다 :

SELECT * FROM ... WHERE name LIKE 'someone'

(그것은 아니다 솔루션,하지만 어떤 경우에는 매우 편리합니다)

LIKE 연산자는 패턴 일치 비교를 수행합니다. 오른쪽의 피연산자는 패턴을 포함하고 왼쪽 피연산자는 패턴과 일치하는 문자열을 포함합니다. 패턴의 백분율 기호 (“% “)는 0 이상의 시퀀스와 일치합니다. 문자열의 문자 패턴의 밑줄 ( “_”)은 문자열의 단일 문자와 일치
하고
다른 문자는 자체 또는 대소 문자를 구분합니다 (예 : 대소 문자를 구분하지 않음
) (버그 : SQLite 만 이해 ASCII 문자의 경우 대문자 / 소문자 LIKE 연산자는 ASCII 범위를 벗어난 유니 코드 문자의 경우 대소 문자를 구분합니다 (예 : ‘a’LIKE ‘A’는 TRUE이지만 ‘æ’LIKE ‘Æ'”FALSE입니다.”)


답변

이것은 sqlite에만 국한되지는 않지만 할 수 있습니다.

SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')


답변

다른 옵션은 사용자 정의 데이터 정렬을 만드는 것입니다. 그런 다음 열에서 해당 데이터 정렬을 설정하거나 select 절에 추가 할 수 있습니다. 주문 및 비교에 사용됩니다.

이것은 ‘voilà’처럼 ‘VOILA’를 만드는 데 사용될 수 있습니다.

http://www.sqlite.org/capi3ref.html#sqlite3_create_collation

배열 함수는 첫 번째 문자열이 각각 두 번째보다 작거나 같거나 큰 경우 음수, 0 또는 양의 정수를 반환해야합니다.


답변

귀하의 경우에는 이해가되지 않을 수도있는 또 다른 옵션은 실제로 기존 열의 사전 점수가 낮은 별도의 열을 갖는 것입니다. 이것은 SQLite 함수를 사용하여 채울 수 있습니다LOWER() 대신이 열에서 일치를 수행 할 수 있습니다.

분명히 중복성과 불일치 가능성이 추가되지만 데이터가 정적 인 경우 적합한 옵션 일 수 있습니다.


답변

간단히 SELECT 쿼리에서 COLLATE NOCASE를 사용할 수 있습니다.

SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE