Dav*_*ave 7 postgresql pattern-matching postgresql-9.5
我正在使用 Postgres 9.5。我想搜索我的名称列不包含空格的行。不过,我对如何为您定义空间有点模糊。我以为它只是我键盘上的空格键,所以我跑了:
.... where name not like '% %';
Run Code Online (Sandbox Code Playgroud)
但后来我得到了一些这样的结果:
| JASON FALKNER
Run Code Online (Sandbox Code Playgroud)
这对我来说确实是一个空间,但可能还有其他一些事情正在发生。有没有更好的方法可以扫描我的名称列不包含空格的行?
使用正则表达式,not (name ~ '\s')
仍然返回看起来有空格的列。
使用:
select cast(name as bytea) ... where name not like like '% %';
Run Code Online (Sandbox Code Playgroud)
回来:
\x4a41534f4ec2a0424c414b45
Run Code Online (Sandbox Code Playgroud)
但是,我仍然有点不清楚我如何使用这些数据来确定如何从我的结果中筛选空间。
我试过了where not (name ~ '[[:space:]]')'
,它返回“JASON BLAKE”与上面相同的字节序列,\x4a41534f4ec2a0424c414b45
。
ype*_*eᵀᴹ 10
我建议您明确提供要被视为“空白”并排除在正则表达式中的字符:
where name !~ '[ \t\v\b\r\n\u00a0]'
Run Code Online (Sandbox Code Playgroud)
人物:
\s white space (space, \r, \n, \t, \v, \f)
' ' space
\t (horizontal) tab
\v vertical tab
\b backspace
\r carriage return
\n newline
\f form feed
\u00a0 non-breaking space
---
Run Code Online (Sandbox Code Playgroud)
请参阅模式匹配的文档。
在您的示例中,请注意这\xC2A0
是 UTF-8 表示的不间断空格 (00A0)。
根据以下 Unicode 列表,存在大量空格字符:
'Separator, Space' 类别中的 Unicode 字符
我会将ypercube 中的 where 子句扩展为:(
编辑:在字符串的开头添加了 \]
where name !~ '[\u0020\u00A0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202f\u205f\u3000]'
Run Code Online (Sandbox Code Playgroud)
人物:
u0020 SPACE
u00A0 NO-BREAK SPACE
u1680 OGHAM SPACE MARK
u2000 EN QUAD
u2001 EM QUAD
U2002 EN SPACE
u2003 EM SPACE
u2004 THREE-PER-EM SPACE
u2005 FOUR-PER-EM SPACE
u2006 SIX-PER-EM SPACE
u2007 FIGURE SPACE
u2008 PUNCTUATION SPACE
u2009 THIN SPACE
u200A HAIR SPACE
u202f NARROW NO-BREAK SPACE
u205f MEDIUM MATHEMATICAL SPACE
u3000 IDEGRAPHIC SPACE
Run Code Online (Sandbox Code Playgroud)
....并再次测试和测试。