仅返回包含数字或特殊字符EXCEPT的字段。错误

时间:2019-10-25 10:25:55

标签: sql regex amazon-redshift

在Redshift中,我想返回包含数字或特殊字符的字段 EXCEPT。(其他值以及a-z和A-Z)

以下内容使我得到了包含数字的所有内容,但我需要将其扩展到除句号(。)之外的任何特殊字符

SELECT DISTINCT name 
FROM  table
WHERE name ~ '[0-9]'

我需要类似的东西:

SELECT DISTINCT name 
FROM  table
WHERE name ~ '[0-9]' OR name ~'[,#';:@~[]{}etcetc'

样本数据:

name
john
joh1n1
j!ohn!
jo!h2n
joh.n
jo.&hn
j.3ohn
j.$9ohn

预期输出:

name
joh1n1
j!ohn!
jo!h2n
jo.&hn
j.3ohn
j.$9ohn

2 个答案:

答案 0 :(得分:1)

您可以这样做:

SELECT DISTINCT name  FROM  table WHERE name !~* '[a-z]'

这意味着:在name个不包含任何字母数字字符的匹配。

Operator !~*的意思是:

  

不匹配正则表达式,不区分大小写


根据提供的示例数据和预期结果进行

编辑

如果要匹配包含至少一个字母字符或点号以外的其他字符的名称,则可以执行以下操作:

select * from mytable where name ~* '[^a-z.]'

Demo on DB Fiddle

with mytable(name) as (values
    ('john'), 
    ('joh1n1'), 
    ('j!ohn!'), 
    ('jo!h2n'), 
    ('joh.n'),
    ('jo.&hn'),
    ('j.3ohn'),
    ('j.$9ohn')
)
select * from mytable where name ~* '[^a-z.]'
| name    |
| :------ |
| joh1n1  |
| j!ohn!  |
| jo!h2n  |
| jo.&hn  |
| j.3ohn  |
| j.$9ohn |

答案 1 :(得分:1)

您可以使用

WHERE name !~ '^[[:alpha:].]+$'

此处,将返回所有不只包含字母或点符号的记录。 ^匹配字符串位置的开始,[[:alpha:].]+匹配一个或多个字母或点,$匹配字符串位置的结束。

如果是PostgreSQL,则可以使用

WHERE name SIMILAR TO '%[^[:alpha:].]%'

SIMILAR TO运算符也接受POSIX字符类,方括号表达式和通配符,并且需要完整的字符串匹配。因此,%允许除字母或点([^[:alpha:].])之外的任何1个字符之前的任何字符,然后直到字符串末尾也可能还有其他任何字符。