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 正则表达式错误?的主要内容,如果未能解决你的问题,请参考以下文章