문자열 일치로 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