清理具有特殊字符和数字的名字

时间:2016-06-23 15:25:01

标签: sql postgresql

我的名字字段中有垃圾,我想清理它们。我试图看到无效的名称(包含所有特殊字符,数字无效)。

select firstname 
from table 
where firstname !~'[[:alpha:]]'

我的查询没有以正确的方式运作。

表格中的输入值如下所示:

Firstname
---------
jack
1h7kk
$han
M.a
pac*^
___*(6&%
a

输出(应该看起来像这样)

Firstname
---------
1h7kk
$han
pac*^
___*(6&%

感谢您的帮助。

谢谢你,Swathi。

2 个答案:

答案 0 :(得分:1)

如果您尝试获取所有无效的名字,请使用

select name
from t 
where name !~*'^[a-z]+$'

使用*进行不区分大小写的匹配。

要获取有效名称,请使用

select name
from t 
where name ~*'^[a-z]+$'

SQL Fiddle

编辑:根据OP的评论,名字也可以包含有效的-space字符。

select name
from t 
where name ~*'(^[a-z]+\.?\-?\s*?[a-z]+\.?$|^[a-z]+$)'

SQL Fiddle with edit

说明:

  • ^[a-z]+以a-z范围内的一个或多个字符开头(不区分大小写)
  • \.后跟可选的.
  • \-?后跟可选的-字符
  • \s?后跟可选空格
  • [a-z]+后跟a-z范围内的一个或多个字符(不区分大小写)
  • \.$以可选.
  • 结尾

答案 1 :(得分:0)

我建议使用游标循环遍历表中的每个条目,然后逐个循环遍历每个条目,用ISALPHA()测试每个条目以查看名称中的任何字符是否不是字母字符。像这样:

DECLARE AlphaCursor CURSOR
FOR SELECT firstname
FROM TABLE;

DECLARE @string varchar(15);

DECLARE @index int;
DECLARE @len int;
DECLARE @char char(1);

DECLARE @IsGood Boolean;

OPEN AlphaCursor;
FETCH NEXT FROM AlphaCursor INTO @string;

WHILE @@FETCH_STATUS = 0
BEGIN

@IsGood = TRUE;

SET @index = 1;
SET @len= LEN(@string);

WHILE @index<= @len
BEGIN
SET @char = SUBSTRING(@string, @index, 1)
IF NOT ISALPHA(@char) THEN
@IsGood = FALSE;
END;

SET @index= @index+ 1;
END;

IF NOT @IsGood THEN
PRINT @string;
END;

FETCH NEXT FROM AlphaCursor INTO @string;

END;