Redshift 正则表达式错误?

Posted

技术标签:

【中文标题】Redshift 正则表达式错误?【英文标题】:Redshift Regular expression bug? 【发布时间】:2019-03-07 16:19:09 【问题描述】:

我有一张带有英国邮政编码字段的表格,我将仅使用正则表达式测试不良格式,即使是基本测试也无法正常工作。

我的值为 CM8 2AX。

如果我跑步

从 sor.party_person 中选择 post_code where 'CM8 2AX' ~ '.*[0-9][A-Z][A-Z]$'

和 post_code = 'CM8 2AX';

我明白了

CM8 2AX

(1 行)

这似乎表明我非常简单的正则表达式对于该值是正确的。

但是,如果我现在直接从数据库中测试相同的值 - 看起来是相同的查询,已经用 and 条件证明这是字段中的值:

从 sor.party_person 中选择 post_code 其中 post_code ~ '.*[0-9][A-Z][A-Z]$' and post_code = 'CM8 2AX';

(0 行)

匹配失败。

我错过了什么?

如果我在最后删除 $,它确实有效,这意味着 db 在字段字符的末尾看到了不同的东西,并且没有将最后一个文本字符识别为最后一个字符,但这对我来说毫无意义。

【问题讨论】:

【参考方案1】:

我认为列的数据类型导致在邮政编码后添加空格字符到列的大小,这在执行 = 时会被忽略,但在执行正则表达式匹配时显然不会。

select post_code from sor.party_person where post_code ~ '.*[0-9][A-Z][A-Z] *$' and post_code = 'CM8 2AX';

应该证明这是正确的。

编辑

我在效果上是正确的,但显然不是= 工作的原因。 SQL 标准规定,当比较两个长度不等的字符串时,填充较短的字符串。所以post_code = 'CM8 2AX' 实际上是在进行比较之前将'CM8 2AX' 填充到 post_code 列的长度。

【讨论】:

谢谢 - 你一针见血。这是一个字符列。我从不使用 char 字段,因为它们很浪费,而且 varchars 几乎总是更合适的选择,但是另一个团队创建了该表,我“假设”他们遵循了我的正常模式并且没有想过要检查。总是一个错误!再次感谢。 只是另一个想法 - Redshift/postgres 似乎在 char 字段周围不一致。长度和匹配似乎隐含地修剪,而模式匹配似乎没有。我个人认为这是一个错误,因为它应该以一致的方式处理字段。 @41jules1967 我认为这与 SQL 标准有关,这里有一个 SO 问题和答案***.com/questions/543580/equals-vs-like

以上是关于Redshift 正则表达式错误?的主要内容,如果未能解决你的问题,请参考以下文章

在 redshift 中使用正则表达式和 casestatements 语句

在 redshift 中使用正则表达式

正则表达式字符串脱离 Redshift

如何从 Redshift 的正则表达式组中选择第一个结果?

Redshift - 根据某些规则应用正则表达式

Amazon Redshift 中匹配序列数字的正则表达式