2009-05-14 3 views
2

검색 쿼리에 문제가 있습니다. 데이터에 여러 가지 형식의 아포스트로피 (HTML 인코딩 및 실제)가있는 이름과 정보가 포함되어 있습니다. 그래서 예를 들어 나는이에 대한 대안 싶습니다SQL에서 선택적 특수 문자와 일치하는 항목을 검색하는 방법은 무엇입니까?

SELECT * FROM Customers WHERE REPLACE(LastName,'''','') 
LIKE Replace('O''Brien,'''','') 

이 그냥 예이다가, 내가 원하는 것은 누군가 유형 OBrien 또는 오브라이언이 여전히 작동하는지, 나는 세 가지를 교체해야하는 방법이다 캐릭터 및 데이터의 버전이 공급되고 변경 될 수 없습니다. 이러한 종류의 검색이 가능하도록 쿼리를 수행 할 수 있습니다.
나는 현재 많은 중첩 된 REPLACE 함수가있는 이런 방식으로 작동하는 이름을 가진 Items를 갖고 있으며, 더 효율적으로 이런 방식으로 작동하는 무언가를 찾지 못하는 것 같습니다.
도움이된다면 ASP가있는 MS SQL 2000을 사용하고 있습니다. 여기에 편집


,이 쿼리는이 작업을 수행하지만 너무 비효율적이다 오브라이언 또는 OBrien 일치해야 쿼리입니다 - (옵션) 항목 이름 및 FIRSTNAME 또 다른 합류한다 일치시키기.

SELECT * FROM Customers 
WHERE 
REPLACE(REPLACE(REPLACE(LastName,''',''),''',''),'''','') 
LIKE 
REPLACE(REPLACE(REPLACE('%O'Brien%',''',''),''',''),'''','') 
+0

* 실제 * 문자 대신 데이터베이스에 HTML 요소를 저장하는 이유는 무엇입니까? – Tomalak

+0

HTML 엔티티는 데이터 소스와 함께 제공됩니다.이 방법으로 데이터를 저장하는 외부 소스에서 가져온 것이므로 실제 문자로 바꿀 수 있습니다 - 복수 대체의 필요성을 해결할 수 있습니다 – RoguePlanetoid

+0

데이터베이스에 HTML이 없으면 모두 불쾌한 두통의 종류, 이것뿐 아니라. 당신이 그것에 관하여 무엇이든을 할 수있는 경우에, 그것을 저장하기 전에 HTML 실재물을 데이터에서 정상화하십시오. – Tomalak

답변

1

이 당신이

SELECT * FROM Customers WHERE 
LastName LIKE 'O%Brien' AND 
REPLACE(LastName,'''','') LIKE 'O''Brien' 

을 할 수있는 아마 최고입니다 당신은 여전히 ​​빈약 한 선택으로, 때로는 테이블 스캔을 얻을 것이다.

기존 색인을 사용하려고하는 첫 번째 이유는 이유입니다. 두 번째로 일치하는 이유는 ObbBrien과 같은 성이 일치하지 않기 때문입니다.

물론 할 수있는 가장 좋은 방법은 못생긴 교체가 필요하지 않을 것입니다. 앱에서 추가로 깨끗한 성을 저장할 수 있습니다. 또는 방아쇠를 당겼습니다. 또는 인덱싱 된보기에서.

1

이 작업을 시도 할 수 :

SELECT * 
FROM Customers 
WHERE LastName LIKE Replace('O''Brien,'''','%') 

원래 열을 수정하지 않는 한이 인덱스를 사용할 수 있도록해야한다.

+0

이 특정 인스턴스에서는 인덱스에서 O로 시작하는 모든 레코드를 가져 오는 것이 너무 비싸다고 생각할 수 있으므로 전체 스캔을 선택할 가능성이 높습니다. 나는 이것이 아마도 당신이 같은 쿼리에서 할 수있는 최선이라고 동의합니다. –

+0

또한 이것은 특정 입력에 대해 매우 위험합니다 : OohnoitsBrien도 일치 할 것입니다 !!! –

0

코드에서 쿼리를 작성하는 대신 매개 변수를 사용하십시오. 당신이 ADO를 사용하는 경우

는이 같은 구문을 사용할 수 있습니다 :

Dim cmd, rs, connect, intNumber 
Set cmd = Server.CreateObject("ADODB.Command") 
cmd.ActiveConnection = "your connectionstring" 
cmd.CommandText = "SELECT * FROM Customers WHERE LastName LIKE @LastName" 
cmd.Parameters.Append cmd.CreateParameter("@LastName",,,,"O'Brien") 
Set rs = cmd.Execute 

이것은 오브라이언 제대로 데이터베이스 형식의 문자열을 쿼리를 수행하고 삽입해야합니다.

매개 변수를 사용하면 모든 값의 형식이 올바르게 지정되고 SQL 주입 공격으로부터 시스템을 보호 할 수 있습니다.

1

순수한 SQL의 경우 이스케이프 처리는 완전히 필요하지 않습니다. 당신이 올바른 유지하고 SQL에서이 작업을 수행하려면

SELECT * FROM Customers WHERE LastName = 'O''Brien'