我有一个名称在字符串末尾可能包含或者可能没有无效字符的表。我该如何删除它们?有效字符是' [a-zA-Z0-9。)]
Create table dbo.temp(name varchar(200) null)
insert into dbo.temp values('Test name1')
insert into dbo.temp values('Test name2#')
insert into dbo.temp values('Test name3 %#%^&^&&&')
insert 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 :(得分: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, ''), ' ', ' ') --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;