2017-03-08 1 views
1

문자열의 끝에 유효하지 않은 문자가 있거나 없을 수있는 이름을 가진 테이블이 있습니다. 어떻게 제거 할 수 있습니까? 유효한 문자는 '[A-ZA-Z0-9.)]문자열에서 마지막 'n'개의 유효하지 않은 문자를 제거하십시오.

C‌reate table dbo.temp(name varchar(200) null) 
i‌nsert into dbo.temp values('Test name1')‌ 
i‌nsert into dbo.temp values('Test name2#')‌ 
i‌nsert into dbo.temp values('Test name3 %#%^&^&&&')‌‌‌ 
i‌nsert into dbo.temp values('------Test Name -----------') 

내가이

‌SELECT CASE WHEN RIGHT(RTRIM(Name),1) NOT LIKE '[a-zA-Z0-9.)]' THEN SUBSTRING(Name,1,LEN(Name)-1) 
      ELSE LTRIM(RTRIM(Name))‌ END as Tname FROM dbo.temp 

시도이다 그러나 이것은 마지막 문자를 삭제합니다.

그리고 마지막 행은 반환해야합니다 : ------Test Name

어떤 제안.

감사 MR

+0

조금 뒤져 보니 사용자 정의 함수가 필요하다고 말할 수 있습니다. –

+0

공간도 함께 넣어야합니까? 또한 유효하지 않은 문자의 모든 인스턴스를 제거 하시겠습니까? 아니면 "끝"에서만 제거 하시겠습니까? 결국, 어떻게 끝을 정의합니까? 아니면 현재 데이터가 유효하지 않은 데이터의 유일한 위치이기 때문에 끝이라고 말하고 있습니까? ( –

+0

) 쓰레기 데이터가있는 곳이기 때문에 끝 부분 만보고 있습니다. 공간에 대해 잊어 버렸습니다. – user2726975

답변

1

여기에 테스트 데이터에 대한 작품과 같은 표기법을 사용하여 OP

declare @temp table(name nvarchar(500) null) 

insert into @temp (name) 
values 
('Test Name') 
,('Test Name2#') 
,('Test Name @%$%#_') 



select 
    CASE 
     WHEN RIGHT(RTRIM(name),1) NOT LIKE '[a-zA-Z0-9.)]' THEN left(name,len(name) - PATINDEX('%[a-zA-Z0-9.)]%',reverse(name)) +1) 
     ELSE name 
    end 
from @temp 
-1

에 나와있는 형식으로 확장해야 하나의 방법입니다, 당신은 당신의 테이블이를 사용하여 제거 할 수 있습니다 쿼리 다음 : 더 행이 갱신되지 않을 때까지

WHILE 1 = 1 
BEGIN 
    UPDATE dbo.temp 
    SET Name = SUBSTRING(Name,1,LEN(Name)-1) 
    WHERE Name LIKE '%[^a-zA-Z0-9.)]' 

    if @@ROWCOUNT = 0 BREAK 
END 

모든 잘못된 결말에, 그것은 하나 개의 문자와 루프를 제거합니다.

편집 :

create table tblTmpTest (Name varchar(100)) 

insert into tblTmpTest 
values ('aaa%¨.^'''), 
('aaa%¨^'''), 
('aaa'), 
('aaa%'); 

select * 
from tblTmpTest; 

WHILE 1 = 1 
BEGIN 
    UPDATE tblTmpTest 
    SET Name = SUBSTRING(Name,1,LEN(Name)-1) 
    WHERE Name LIKE '%[^a-zA-Z0-9.)]' 

    if @@ROWCOUNT = 0 BREAK 
END 


select * 
from tblTmpTest; 

drop table tblTmpTest; 
+1

여기 루프가 필요 없습니다. –

+0

어쨌든 루프의 요점은 무엇입니까? –

+0

여기 루프는 patindex()보다 간단합니다. 비록 성능면에서 좋지는 않더라도, 한동안 사용 된 가벼운 퍼지의 필요성에 맞을 수 있습니다. – Lostblue

0

당신은 인라인 테이블 값 함수를 사용할 수 있습니다이 잘못된 문자의 모든 항목을 제거 할 때문에 : 그것은 작동하지 않습니다 생각하는 사람들을 위해, 여기에 빠른 테스트를 재생하는 것입니다 . 이것은 영숫자를 찾는 내 함수의 변형입니다.

create function RemoveInvalidCharacters 
(
    @SearchVal varchar(8000) 
) returns table as return 
    with MyValues as 
    (
     select substring(@SearchVal, N, 1) as value 
      , t.N 
     from cteTally t 
     where N <= len(@SearchVal) 
      and substring(@SearchVal, N, 1) like '[ a-zA-Z0-9.)]' 
    ) 

    select distinct NumValue = REPLACE(STUFF((select value + '' 
       from MyValues mv2 
       order by mv2.N 
       for xml path('')), 1, 0, ''), '&#x20;', ' ') --the replace here is because we need to change the space back to character data 
    from MyValues mv 

cteTally는 표준 숫자 또는 탤리 테이블입니다. 나는 내 시스템에서 이처럼 보이는 하나의 견해를 유지한다.

create View [dbo].[cteTally] as 

WITH 
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)), 
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows 
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max 
    cteTally(N) AS 
    (
     SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4 
    ) 
select N from cteTally 
관련 문제