2011-03-09 27 views

回答

2

要查找包含数字的所有行,可以使用LikeColumn like ('%[0-9]%') 您可以扩展到包含其他不需要的字符。 Column like ('%[0-9,@,#,$]%')

对于想要指定有效的字符并查找非法行的情况,我没有很好的解决方案。这是一个解决方案,首先分割列,以便每个字符都有一行。根据你的桌子的大小,这可能对你有用,或者它太慢了。

declare @T table (ID int, Name varchar(50)) 

insert into @T values 
(1, 'Name'), 
(2, 'Name1'), 
(3, '@Name'), 
(4, 'Nam3e') 

;with CharSplit as 
(
    select 
    ID, 
    left(Name, 1) as Val, 
    stuff(Name, 1, 1, '') as Name 
    from @T 
    union all 
    select 
    ID, 
    left(Name, 1) as Val, 
    stuff(Name, 1, 1, '') as Rest 
    from CharSplit 
    where Len(Name) > 0 
), 
InvalidList as 
(
    select distinct ID 
    from CharSplit 
    where Val not between 'a' and 'z' 
) 
select 
    T.ID, 
    T.Name 
from InvalidList as I 
    inner join @T as T 
    on I.ID = T.ID 

结果

ID   Name 
----------- -------------------------------------------------- 
2   Name1 
3   @Name 
4   Nam3e 

如果使用区分大小写的排序规则,你可能需要包括and Val not between 'A' and 'Z'以及(未测试)。

+0

非常感谢你的帮助。 – Walker 2011-03-09 14:33:17

1

为了提供例如基于什么样的Mikael说:

declare @Data table (id int not null primary key identity(1,1), blurb nvarchar(255) , number nvarchar(255)) 

insert into @Data([blurb] , [number]) values 
('Not only Numeric' , '(011) 555-1234') 
,('Pure Text'  , 'Test') 
,('Good Number'  , '12345') 

select * from @Data where number not like '%[^0-9]%' -- Valid Data 
select * from @Data where number  like '%[^0-9]%' -- Invalid Data 
+0

非常感谢你的帮助。 – Walker 2011-03-09 14:34:04

2

性格分裂by Mikael Eriksson的想法可以用数字表的帮助下实现方式不同:

WITH atable AS (
    SELECT * 
    FROM (
    VALUES 
     (1, 'Name'), 
     (2, 'Name1'), 
     (3, '@Name'), 
     (4, 'Nam3e') 
) x (ID, Name) 
), 
atable_split AS (
    SELECT 
    t.ID, 
    t.Name, 
    OneChar = SUBSTRING(t.Name, v.number, 1) 
    FROM atable t 
    INNER JOIN master..spt_values v 
     ON v.type = 'P' AND v.number BETWEEN 1 AND LEN(t.Name) 
) 
SELECT ID, Name 
FROM atable_split 
GROUP BY ID, Name 
HAVING MAX(CASE WHEN OneChar BETWEEN 'a' AND 'z' THEN 0 ELSE 1 END) = 1 

这种方法产生比Mikael所做的更好的执行计划,它可能甚至不是最好的执行计划。

+0

+1使用数字表比分割字符串的递归cte要好。 – 2011-03-09 12:56:15

+0

非常感谢你的帮助。 – Walker 2011-03-09 14:32:34

相关问题