2017-03-08 5 views
1

文字列の末尾に無効な文字が含まれていてもいなくてもよい名前のテーブルがあります。どうすれば削除できますか?有効な文字は、[-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 

、それは一つの文字とループを削除します。

EDIT:それは動作しないと思う人のために、ここでプレーするための迅速なテストです:

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は単なる標準的な数値または集計表です。私はこのように見える私のシステムのビューとして1つを保つ。

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 
関連する問題