2016-11-30 2 views
2

데이터베이스의 와일드 카드와 조건이 일치해야하는 쿼리를 작성해야합니다.데이터베이스에서 와일드 카드로 SQL Server 쿼리

예를 들어 명확 해집니다.

나는 963-4-AKS~M2RN21AXA150~~~0C1D1D~~XX과 같은 필드가있는 열이 있습니다. ~ char는 와일드 카드입니다. 그래서 다음 CRITERIAS이 일치해야합니다 :

  • ~63-4-AKS~M
  • 963-4-AKS1M
  • 963-4-AKS~M2RN21AXA150AAA
  • 963-4-AKSAM2RN21AXA150AAA
  • 963-4-AKSCM2RN21AXA150A060C1D1DSDXX
  • 963-4-AKS~M2RN21AXA150~~~0C1D1D~~XX
,

나는 머리가 아플 정도로 많은 것을 시도했다. (

다른 방법으로 (와일드 카드를 기준으로) 아무런 문제가 없다. 그러나 이런 식으로 나는 열쇠를 찾을 수 없다.

필드에 ~이있는 경우 문제가 발생합니다. 다음 문을 그래서 여기에 첫 번째와 마지막 검색 :

SELECT myField FROM myTable WHERE myField LIKE REPLACE('%' + myCriteria + '%', '~', '_');

+0

'~'를'%'로 대체하십시오. –

+1

왜 'REPLACE ('% '+ myCriteria +'% ','~ ','_ ')'라고 생각하십니까? '_'는 한 글자의 와일드 카드입니다 – Shadam

+0

하지만 첫 번째와 마지막 경기 만 말했습니다. 그래서 나는 또 다른 해결책을 제시하고 있었다. –

답변

1

패턴과 필드 왼쪽으로 조정됩니다 보인다.
내 머리를 숙이고 (슬픔이 가득 찬 채로) 이것이 사실이라면, 여기에 기능이 있습니다.

+---------------------------------------+------------+ 
| myCriteria       | is_a_match | 
+---------------------------------------+------------+ 
| ~63-4-AKS~M       | 1   | 
+---------------------------------------+------------+ 
| 963-4-AKS1M       | 1   | 
+---------------------------------------+------------+ 
| 963-4-AKS~M2RN21AXA150AAA    | 1   | 
+---------------------------------------+------------+ 
| 963-4-AKSAM2RN21AXA150AAA    | 1   | 
+---------------------------------------+------------+ 
| 963-4-AKSCM2RN21AXA150A060C1D1DSDXX | 1   | 
+---------------------------------------+------------+ 
| 963-4-AKS~M2RN21AXA150~~~0C1D1D~~XX | 1   | 
+---------------------------------------+------------+ 
| 963-4-AKS~M2RN21AXA150~~~0C1X1D~~XX | 0   | 
+---------------------------------------+------------+ 
| 963-4-AKS~M2RN21AXA150~~~0C1D1D~~XXYY | 0   | 
+---------------------------------------+------------+ 

당신은 필드와 패턴 사이에 혼합되어



select  myCriteria 
      ,dbo.is_a_match (myField,myCriteria) as is_a_match 

from  (values ('~63-4-AKS~M'       ) 
        ,('963-4-AKS1M'       ) 
        ,('963-4-AKS~M2RN21AXA150AAA'   ) 
        ,('963-4-AKSAM2RN21AXA150AAA'   ) 
        ,('963-4-AKSCM2RN21AXA150A060C1D1DSDXX' ) 
        ,('963-4-AKS~M2RN21AXA150~~~0C1D1D~~XX' ) 
        ,('963-4-AKS~M2RN21AXA150~~~0C1X1D~~XX' ) 
        ,('963-4-AKS~M2RN21AXA150~~~0C1D1D~~XXYY') 

      ) c (myCriteria) 
      ,(values ('963-4-AKS~M2RN21AXA150~~~0C1D1D~~XX' ) 
      ) f (myField) 
create function is_a_match (@myField varchar(100),@myCriteria varchar(100)) 
returns bit 
as 
begin 

    declare @i     int = 0 
      ,@is_a_match  bit = 1 
      ,@len_myField  int = len(@myField) 
      ,@len_myCriteria int = len(@myCriteria) 
      ,@myField_c   char(1) 
      ,@myCriteria_c  char(1) 

    While 1=1 
    begin 

     set @i += 1 

     if @i > @len_myCriteria break 

     if @i > @len_myField  
     begin 
      set @is_a_match = 0 
      break 
     end 

     set @myField_c = substring(@myField ,@i,1) 
     set @myCriteria_c = substring(@myCriteria,@i,1) 

     if not (@myField_c = '~' or @myCriteria_c = '~' or @myField_c = @myCriteria_c) 
     begin 
      set @is_a_match = 0 
      break 
     end 

    end 

    return @is_a_match 
end 

GO 

.
필드에 와일드 카드가 들어 있지 않을 수 있습니다.

예. 이 때문에 'A의

963-4-AKS ~ M2RN21AXA150 ~~~ 0C1D1D ~~ XX
963-4-AKS 의 일치가 아닌 M2RN21AXA150 AAA

+0

그건 나 아닌 클라이언트입니다. 나는 그에게 설명하려고했지만 아무런 결과가 없었다 : ( – Shadam

+0

첫 번째가 데이터베이스에 있다면 예를 들어, 두 번째가 일치해야한다. 내가 말했듯이, 다른 방식으로는 아무런 문제가 없지만, 꽤 힘들다. – Shadam

+0

@ Shadam, 업데이트 된 답변보기 ... –

0

당신이 할 수 있다면 와일드 카드에 대한 제약 조건을 강화하면 여기에서 싸울 기회가있을 수 있습니다. 제 말은 지속 된 데이터에 와일드 카드가 표시되면 올바른 순열을 생성한다는 것입니다. 그런 다음 기존 쿼리로 순열을 쿼리하십시오.

그러나 모든 와일드 카드에 36 개의 가능한 옵션이있는 경우 이는 기하 급수적으로 고통스러워집니다.

+0

그것은'NVARC HAR (100)'필드와 그 안에있는 모든 단일 문자 (******)는 와일드 카드가 될 수 있습니다. 제 의뢰인은 제 정신이 아니며 이것이 애플리케이션 성능을 어떻게 파괴 할 수 있는지 이해하지 못합니다. – Shadam

+0

문자열은 어떤 종류의 모델 번호처럼 느껴집니다. 즉, 이것을 제한 할 수있는 어딘가에 마스터 목록이 있어야합니다. 기지에서 떨어져 있니? – randcd