복붙노트

[SQL] SQL Server는 빈 공간을 무시하고 같이 사용하여 검색

SQL

SQL Server는 빈 공간을 무시하고 같이 사용하여 검색

나는 데이터베이스에 전화 열을 가지고 있고, 기록은 오른쪽에 원치 않는 공백을 포함. 나는 트림을 사용하고 교체했는데, 그것은 올바른 결과를 반환하지 않았습니다.

내가 사용하는 경우

phone like '%2581254%'

그것은 반환

 customerid
 -----------
 33470
 33472
 33473
 33474

하지만 난 단지, 난 단지 왼쪽을 일치시킬 처음에 퍼센트 기호 또는 와일드 카드를 사용할 필요가있다.

나는 이런 식으로 사용한다면

 phone like '%2581254'

나는 때문에 오른쪽에 공백, 아무 것도 얻을 수 없습니다!

나는 트림을 사용하고 교체하고 노력 그래서 나는 하나 개의 결과 만 얻을

LTRIM(RTRIM(phone)) LIKE '%2581254'

보고

 customerid
 -----------
 33474

이 네 가지 ID를 동일한 전화 번호가 있습니다!

테이블 데이터

customerid    phone
-------------------------------------
33470         96506217601532388254
33472         96506217601532388254
33473         96506217601532388254
33474         96506217601532388254  
33475         966508307940                                                                                                             

나는 제안 시험을 위해 많은 수를 추가

PHP 함수는 지난 7 개 자리를 소요하고 비교합니다.

예를 들면

01532388254 will be 2581254

나는 전화 번호이 7 개 자리를 가지고 모든 사용자에 대해 검색 할 2581254

문제가 어디 내가 알아낼 수 없습니다!

그것은 4 식별자 대신 한 ID를 반환해야합니다

해결법

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

    1.샘플 데이터를 감안할 때, 나는 당신이 당신의 데이터에 제어 문자를 생각한다. 예를 들면 문자 (13), 문자 (10)

    샘플 데이터를 감안할 때, 나는 당신이 당신의 데이터에 제어 문자를 생각한다. 예를 들면 문자 (13), 문자 (10)

    이를 확인하려면 바로 다음을 실행

    Select customerid,phone
     From  YourTable
     Where CharIndex(CHAR(0),[phone])+CharIndex(CHAR(1),[phone])+CharIndex(CHAR(2),[phone])+CharIndex(CHAR(3),[phone])
          +CharIndex(CHAR(4),[phone])+CharIndex(CHAR(5),[phone])+CharIndex(CHAR(6),[phone])+CharIndex(CHAR(7),[phone])
          +CharIndex(CHAR(8),[phone])+CharIndex(CHAR(9),[phone])+CharIndex(CHAR(10),[phone])+CharIndex(CHAR(11),[phone])
          +CharIndex(CHAR(12),[phone])+CharIndex(CHAR(13),[phone])+CharIndex(CHAR(14),[phone])+CharIndex(CHAR(15),[phone])
          +CharIndex(CHAR(16),[phone])+CharIndex(CHAR(17),[phone])+CharIndex(CHAR(18),[phone])+CharIndex(CHAR(19),[phone])
          +CharIndex(CHAR(20),[phone])+CharIndex(CHAR(21),[phone])+CharIndex(CHAR(22),[phone])+CharIndex(CHAR(23),[phone])
          +CharIndex(CHAR(24),[phone])+CharIndex(CHAR(25),[phone])+CharIndex(CHAR(26),[phone])+CharIndex(CHAR(27),[phone])
          +CharIndex(CHAR(28),[phone])+CharIndex(CHAR(29),[phone])+CharIndex(CHAR(30),[phone])+CharIndex(CHAR(31),[phone])
          +CharIndex(CHAR(127),[phone]) >0
    

    테스트 결과가 긍정적 인 경우

    다음 UDF는 업데이 트를 통해 데이터로부터 제어 문자를 제거 할 수 있습니다

    Update YourTable Set Phone=[dbo].[udf-Str-Strip-Control](Phone)
    

    관심이 경우, UDF

    CREATE FUNCTION [dbo].[udf-Str-Strip-Control](@S varchar(max))
    Returns varchar(max)
    Begin
        ;with  cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
               cte2(C) As (Select Top (32) Char(Row_Number() over (Order By (Select NULL))-1) From cte1 a,cte1 b)
        Select @S = Replace(@S,C,' ')
         From  cte2
    
        Return LTrim(RTrim(Replace(Replace(Replace(@S,' ','><'),'<>',''),'><',' ')))
    End
    --Select [dbo].[udf-Str-Strip-Control]('Michael        '+char(13)+char(10)+'LastName')  --Returns: Michael LastName
    

    약속 (빌에 의해 슬쩍 찔렀다)으로, 다음은 UDF에 약간의 논평이다.

  2. from https://stackoverflow.com/questions/42958278/sql-server-search-using-like-while-ignoring-blank-spaces by cc-by-sa and MIT license