복붙노트

[SQL] 왜 Access에서 LIKE 쿼리는 레코드를 반환하지 않는 이유는 무엇입니까?

SQL

왜 Access에서 LIKE 쿼리는 레코드를 반환하지 않는 이유는 무엇입니까?

어떤 이유가 있습니까

SELECT * FROM MyTable WHERE [_Items] LIKE '*SPI*'

OleDbAdapter.Fill (데이터 집합) 또는 OleDbCommand.ExecuteReader ()로 모든 레코드를 반환하지 않습니다?

내가 직접 MS Access에서 같은 SQL을 실행하면 예상 레코드를 반환합니다. 또한, 같은 코드에서, 나는에 SQL을 변경하는 경우

 SELECT * FROM MyTable 

모든 레코드가 반환됩니다.

해결법

  1. ==============================

    1.OLE DB를 사용할 때 % 와일드 카드 검색대로 %에 *를 변경합니다.

    OLE DB를 사용할 때 % 와일드 카드 검색대로 %에 *를 변경합니다.

    SELECT * FROM MyTable WHERE [_Items] LIKE '%SPI%' 
    
  2. ==============================

    2.%로 *에서 모두와 와일드 카드 문자에 LIKE를 변경해보십시오.

    %로 *에서 모두와 와일드 카드 문자에 LIKE를 변경해보십시오.

    액세스 데이터베이스 엔진 (제트, ACE는, 무엇이든) LIKE 각 사용 다른 와일드 카드 문자 두 ANSI 쿼리 모드가 있습니다 :

    OLE DB는 항상 ANSI-92 쿼리 모드를 사용합니다. DAO는 항상 ANSI-89 쿼리 모드를 사용합니다. 액세스 UI는 하나 또는 다른을 사용하도록 설정할 수 있습니다.

    모두 키워드를 사용하는 경우에는, 와일드 카드 문자에 관계없이 ANSI 쿼리 모드 항상 %입니다.

    정확히 여덟 숫자로 구성되어야 데이터 요소를 명시 비즈니스 규칙을 고려하십시오. 다음과 같이 말 나는 규칙을 구현 :

    CREATE TABLE MyStuff 
    (
     ID CHAR(8) NOT NULL, 
     CHECK (ID NOT LIKE '%[!0-9]%')
    );
    

    이 액세스의 CHAR 데이터 유형 및 CHECK 제약 조건 만 ANSI-92 쿼리 모드에서 생성 될 수 있기 때문에 나는 와일드 카드 문자로 %를 사용하는 것이 불가피하다.

    그러나 누군가는 항상 ANS-89 쿼리 모드를 사용하는 DAO를 사용하여 데이터베이스에 액세스 할 수 있고, % 문자는 문자로 간주 될 오히려 '특별한'문자보다, 다음과 같은 코드가 실행될 수 있습니다 :

    INSERT INTO MyStuff (ID) VALUES ('%[!0-9]%');
    

    삽입은 성공할 내 데이터 무결성 기회가 될 것입니다 :(

    동일은 유효성 검사 규칙에 LIKE와 *를 사용하여 말할 수있다는 ANSI-89 쿼리 모드에서 만든 항상 ANSI-92 쿼리 모드를 사용하여 ADO, 및 삽입하는 * 문자를 사용하여 연결하는 사람이 어디 * 문자가 될해야하지 않는다 .

    지금까지 내가 아는 한, ANSI 쿼리 모드는 액세스 하나의 Access 데이터베이스에 사용되는 강제의 방법이 없습니다. 따라서, 나는 모든 SQL 일관 관계없이 사용자가 선택한 ANSI 쿼리 모드의 행동을 구분해야한다고 생각합니다.

    이 모두 예컨대 상기의 예와 마찬가지로 사용을위한 코드도 어렵지 않다 참고

    CHECK (
           ID NOT LIKE '%[!0-9]%'
           AND ID NOT LIKE '*[!0-9]*'
          )
    

    ... 또는 실제로 완전히 예를 들어, 와일드 카드 피하기

    CHECK (ID LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')
    

    그러나, 모두 사용하여 인간 독자 코드 즉 쉽게 상세 이하 유지하는 것이 더 쉽게 발생한다.

    시간이 SQL 표준과 호환되는 SQL 제품에 포트에 올 때 또한, LIKE에 모두 포트를 너무 잘 즉 변형시키는 동일 조건 변경 허락 키워드가 필요합니다 모든 것입니다. 주어진 SQL 술어를 분석 할 때, 텍스트 리터럴에 * 문자의 모든 인스턴스를 여러 개 발견하는 것보다에서 같은 키워드를 찾아 멀리, 훨씬 더 쉽다. 기억하십시오 "휴대용"하지 않습니다 의미 " '있는 그대로'실행 코드"; 오히려, 그것은 동일한 제품의 버전 사이를 이동하는 것을 염두에 플랫폼 간의 코드 (곰을 이동하는 것이 얼마나 쉬운의 측정은 ACE에 포트 예를 들어 제트 4.0 포트입니다입니다 사용자 수준 보안이 더 이상 기능, DECIMAL 값 때문에 일종의 다르게, 등).

  3. ==============================

    3.%에 와일드 카드 문자 (*)를 전환 시도

    %에 와일드 카드 문자 (*)를 전환 시도

    이 문제를 밖으로 정렬해야한다.

  4. ==============================

    4.이름 : Jeez,이 작품! 고마워요.

    이름 : Jeez,이 작품! 고마워요.

    난 그냥 비슷하지 기준을 기준처럼하지 대체했다.

    나는 두 시간 검색의 도움을 다른 사람에게 내 "이야기가"쉽게이 게시물을 찾아서 저장 공유하고 있습니다.

    내가 액세스 2010 데이터베이스에 엑셀 95-97 XLS 파일을 연결하고, 한하지만 RAN은, 어떤 이상한 이유로 선택 쿼리가 '문자열에게 I를 찾을 수 없습니다 테이블을 생성하고 데이터베이스에 모든 데이터를 가져 오는 쿼리에 삽입 입력했습니다.

    난 안 "무엇인가"와 같은 아니라 성공하지 못했다 "%의 뭔가 %"와 같은 시도 - 간단하게 작동하지 않았다.

  5. from https://stackoverflow.com/questions/5166907/why-does-a-like-query-in-access-not-return-any-records by cc-by-sa and MIT license