Postgresql
查找列不包含“空格”的行
我正在使用 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 列表,存在大量空格字元:
我會將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
….並再次測試和測試。