2014-11-26 2 views
0

2.1M 행을 가진 많은 열이있는 테이블이 있습니다. 여기에 내 문제와 관련되는 열은 다음과 같습니다밑줄 및 공백을 제외한 특수 문자가 포함 된 행을 찾습니다.

Column_name Type Computed Length Prec Scale Nullable TrimTrailingBlanks FixedLenNullInSource Collation 
id   int  no   4  10  0  no   (n/a)    (n/a)     NULL 
val   varchar no   15      yes   no     yes      SQL_Latin1_General_CP1_CI_AS 

내가 A-Z, a-z, 0-9, (공간) 이외의 문자 및 열 val에서 _ 포함 된 행을 반환합니다. 샘플 데이터 :

INSERT INTO tabl 
      (id, val) 
VALUES  (1, 'Extemporè'), 
      (2, 'Aâkash'), 
      (3, 'Driver 12'), 
      (4, 'asd'), 
      (5, '10'), 
      (6, 'My_Car'), 
      (7, 'Johnson & Sons'), 
      (8, 'Johan''s Service'), 
      (9, 'Indus Truck') 

예상 출력 : 제가 비슷한 질문 here 그러나 또한 제공되지 예상 검색 결과

id val 
-- ----------- 
1 Extemporè 
2 Aâkash 
7 Johnson & Sons 
8 Johan's Service 
:

id val 
-- ---------- 
7 Johnson & Sons 
8 Johan's Service 
:

SELECT * 
FROM tabl 
WHERE val LIKE '%[^A-Z0-9 _]%' 

을 결과를 제공합니다

+0

SELECT * FROM tbl 여기서 PATINDEX ('% [^ a-zA-Z0-9 _] %', Col)> 0 – knkarthick24

+0

@ knkarthick24 그것은 내 쿼리와 같은 결과를 제공하며 ID가 1과 2 인 행을 반환하지 않습니다. –

+0

어떤 결과를 얻지 않았다고 생각합니까? 당신의 대조는 무엇입니까? 'WHERE val LIKE '% [^ a-zA-Z0-9 _] %'COLLATE Latin1_General_CI_AI'을 시도하십시오. 실제로, '% [^ A-Z0-9 _] %' ' –

답변

3

내가 Latin1_General_BIN like this 같은 조합의 도움으로 이런 짓을 했을까 :

SELECT * 
FROM tabl 
WHERE val COLLATE Latin1_General_BIN LIKE '%[^A-Za-z0-9 _]%' 

BIN 데이터 정렬이 또한 대소 문자를 구별 모두 악센트에 민감하고 있습니다 때문에이 방법을 쉽게 보일 수있을 것입니다, 악센트 부호가있는 문자는 악센트가없는 문자와 별도로 정렬됩니다. 후자는 범위 형식으로 비표준 문자를 지정하는 것이 쉽다는 것을 의미합니다. (대소 문자 구분은 위에서 볼 수 있듯이 두 경우의 문자를 명시 적으로 지정해야 함을 의미합니다.)

1

updated 대답 : 임시 테이블의 사용은 "드라이버"또는 "인더스 트럭"과 같은 값을 제외하는 것입니다; 임시 테이블은 또한 "Aâkash"와 같은 값에 대해 데이터 정렬 변경을 강제합니다. 이는 올바른 값이 조인에서 제외 될 자격이 없는지 확인하는 것입니다.
참고 : 올바른 값에 '또는 &과 같은 특수 문자를 수동으로 목록에 추가해야합니다 (아래 표시된 위치).

create table #tabl(id int, val varchar(15)) 

insert #tabl(id, val) 
select i.id, cast(i.val as varchar(200)) Collate SQL_Latin1_General_CP1253_CI_AI as val 
from tabl i 
where i.val <> upper(i.val) Collate SQL_Latin1_General_CP1_CS_AS 
    and i.val <> lower(i.val) Collate SQL_Latin1_General_CP1_CS_AS 
    and i.val not like '%[0-9]%' 
    and i.val not like '%[_]%' 
    and i.val not like '%[]%' 
    and i.val not like '%[''&]%' -- add special characters (like ' or &) that are permitted in this list; 
          -- this is the only "manual" requirement for this solution to work. 

select t.id, t.val 
from tabl t 
left join #tabl tt on t.val = tt.val 
where tt.val is null 
    and t.val <> upper(t.val) Collate SQL_Latin1_General_CP1_CS_AS 
    and t.val <> lower(t.val) Collate SQL_Latin1_General_CP1_CS_AS 
    and t.val not like '%[0-9]%' 
    and t.val not like '%[_]%' 
    and t.val not like '%[]%' 
+0

답변 해 주셔서 감사합니다. 실제 데이터로 쿼리를 검사했는데 대문자와 소문자 조합이있는 레코드도 반환한다는 것을 알았습니다. 예를 들어, 데이터가 행 3의 'Driver 12'대신에 'Driver'인 경우, 원하지 않는 데이터를 반환합니다. 샘플 데이터에서 이러한 레코드를 업데이트했습니다. –

+0

@DeepakPawar, 추가 규칙과 일치하는 답변이 업데이트되었습니다.다시 시도하고 메모를 확인하십시오 (값에 허용 된 특수 문자를 식별하여 목록에 표시해야 함). –

+0

이렇게 +1 할 수는 있지만'WHERE val LIKE '% [^ abcdefghijklmnopqrstuvwxyz0-9_ %]'와 같이 검색 문자열에 명시 적으로'az' 문자를 정의하는 다른 소스에서 대답을 얻었습니다. 특수 문자보다 유효한 문자 문자열을 추가하십시오. –

관련 문제