首页 > 解决方案 > Redshift 正则表达式错误?

问题描述

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

我的值为 CM8 2AX。

如果我跑

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

和 post_code = 'CM8 2AX';

我明白了

CM8 2AX

(1 行)

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

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

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

(0 行)

它不匹配。

我错过了什么?

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

标签: regexamazon-redshift

解决方案


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

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 列的长度。


推荐阅读