我有一个eventDate列,其中包含尾随空格。我正在尝试使用PostgreSQL函数TRIM()删除它们。更具体地说,我正在跑步:SELECT TRIM(both ' ' from eventDate)FROM EventDates;但是,尾随空格不会消失。此外,当我尝试从日期中修剪另一个字符(例如数字)时,它也不会修剪。如果我正确阅读the manual,则应该可以。有什么想法吗? 最佳答案 有许多不同的不可见字符。它们中的许多在Unicode中都具有WSpace=Y(“空白”)属性。但是某些特殊字符不被视为“空白”,并且仍然没有可见的表示形式。 Wikipedia上有关space (punctuation)和whitespace characters的出色文章应该给您一个想法。 Unicode在这方面很烂:引入了许多主要用来使人们感到困惑的奇特字符。 默认情况下,The standard SQL trim() function仅修剪基本的拉丁空格字符(Unicode:U + 0020 / ASCII 32)。与 rtrim() and ltrim() 变体相同。您的通话也仅针对该特定角色。而是将正则表达式与 regexp_replace() 一起使用。尾随要删除所有结尾的空格(但不删除字符串中的空格):SELECT regexp_replace(eventdate, '\s+$', '') FROM eventdates;正则表达式说明: \s .. regular expression class shorthand for [[:space:]] -这是一组空白字符-请参阅下面的限制+ .. 1个或多个连续匹配$ ..字符串结尾演示:SELECT regexp_replace('inner white ', '\s+$', '') || '|'返回值:inner white|是的,那是一个反斜杠(\)。此相关答案中的详细信息。 SQL select where column begins with \ 领导要删除所有前导空格(但不删除字符串中的空格):regexp_replace(eventdate, '^\s+', '')^ ..字符串的开头都要同时删除和,可以链接以上函数调用:regexp_replace(regexp_replace(eventdate, '^\s+', ''), '\s+$', '')或者,您可以将它们与两个branches结合在一个调用中。添加'g'作为第四个参数来替换所有匹配项,而不仅仅是第一个:regexp_replace(eventdate, '^\s+|\s+$', '', 'g')但这通常应该使用 substring() 更快:substring(eventdate, '\S(?:.*\S)*')\S ..除空白外的所有内容(?: re ) Non-capturing set of parentheses.* ..任何0-n个字符的字符串或以下之一:substring(eventdate, '^\s*(.*\S)')substring(eventdate, '(\S.*\S)')( re ) .. Capturing set of parentheses有效地获取第一个非空白字符以及所有内容,直到最后一个非空白字符(如果有)。空格?还有更多的related characters which are not classified as "whitespace" in Unicode-字符类[[:space:]]中没有包含。这些对我来说是pgAdmin中的不可见字形:“蒙古元音”,“零宽度空间”,“零宽度非连接符”,“零宽度连接符”:SELECT E'\u180e', E'\u200B', E'\u200C', E'\u200D';'᠎' | '​' | '‌' | '‍'另外两个,在pgAdmin中打印为可见字形,但在我的浏览器中不可见:“单词连接器”,“零宽度不间断空格”:SELECT E'\u2060', E'\uFEFF';'⁠' | ''最终,是否使字符不可见还取决于用于显示的字体。要同时删除所有的,请将'\s'替换为'[\s\u180e\u200B\u200C\u200D\u2060\uFEFF]'或'[\s᠎​‌‍⁠]'(注意尾随的不可见字符!)。示例,而不是:regexp_replace(eventdate, '\s+$', '')采用:regexp_replace(eventdate, '[\s\u180e\u200B\u200C\u200D\u2060\uFEFF]+$', '')要么:regexp_replace(eventdate, '[\s᠎​‌‍⁠]+$', '') -- note invisible characters局限性还有Posix character class [[:graph:]] 应该代表“可见字符”。例:substring(eventdate, '([[:graph:]].*[[:graph:]])')它在每种设置中都可以可靠地工作于ASCII字符(归结为[\x21-\x7E]),但是目前为止(包括第10页)取决于基础操作系统提供的信息(以定义ctype)以及可能的语言环境设置。严格来说,对字符类的每次引用都是这种情况,但似乎与图形等较不常用的字符存在更多的分歧。但是您可能必须在字符类[[:space:]](简写\s)中添加更多字符才能捕获所有空白字符。 Like: \u2007 , \u202f and \u00a0 seem to also be missing for @XiCoN JFS。 The manual: Within a bracket expression, the name of a character class enclosed in [: and :] stands for the list of all characters belonging to that class. Standard character class names are: alnum, alpha, blank, cntrl, digit, graph, lower, print, punct, space, upper, xdigit. These stand for the character classes defined in ctype. A locale can provide others.大胆强调我的。另请注意,此限制是fixed with Postgres 10: Fix regular expressions' character class handling for large character codes, particularly Unicode characters above U+7FF (Tom Lane) Previously, such characters were never recognized as belonging to locale-dependent character classes such as [[:alpha:]].关于sql - 使用PostgreSQL修剪尾随空格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22699535/
10-13 03:35