删除最后一个' n'字符串

时间:2017-03-08 15:29:47

标签: sql-server

我有一个名称在字符串末尾可能包含或者可能没有无效字符的表。我该如何删除它们?有效字符是' [a-zA-Z0-9。)]

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

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:-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;