Postgresql

查找列不包含“空格”的行

  • March 29, 2017

我正在使用 Postgres 9.5。我想搜尋我的姓名列不包含空格的行。不過,我對如何為您定義空間有點模糊。我以為這只是我鍵盤上的空格鍵,所以我跑了:

.... where name not like '% %';

但後來我得到了一些這樣的結果:

| JASON FALKNER

這對我來說確實像是一個空間,但可能還有其他一些事情正在發生。有沒有更好的方法可以掃描我的名稱列不包含空格的行?

使用正則表達式,not (name ~ '\s')仍然返回看起來像有空格的列。

使用:

select cast(name as bytea) ... where name not like like '% %';

回來:

\x4a41534f4ec2a0424c414b45

但是,我仍然有點不清楚如何使用這些數據來找出如何從我的結果中篩選空間。

我試過where not (name ~ '[[:space:]]')'了,它返回“JASON BLAKE”,上面的字節序列相同,\x4a41534f4ec2a0424c414b45.

我建議您明確提供您希望被視為“空白”並排除在正則表達式中的字元:

where name !~ '[ \t\v\b\r\n\u00a0]'

人物:

\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
---

有關模式匹配,請參閱文件。

在您的範例中,請注意這是非中斷空間 (00A0)\xC2A0的 UTF-8 表示。

根據以下 Unicode 列表,存在大量空格字元:

“分隔符,空格”類別中的 Unicode 字元

我會將ypercubeᵀᴹ 回答中的 where 子句擴展為:(

編輯:在字元串開頭添加 ]

where name !~ '[\u0020\u00A0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202f\u205f\u3000]'

人物:

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

….並再次測試和測試。

引用自:https://dba.stackexchange.com/questions/168134