postgresql:不允许负子串长度但数据中没有明显违规

postgresql: negative substring length not allowed but no obvious violation in data

当我在 postgresql 中 运行 以下查询时,我收到错误消息 ERROR: negative substring length not allowed:

select count(*) as name_matches
from table1 x
inner join
(select * from table2 where trim(last_name) <> 'unknown') y
using (id1)
where substring( trim(x.full_name), 1, (length( trim(x.full_name) ) - 2) ) = trim(y.last_name||' '||y.first_name)

然而,这个查询 returns 0 个结果:

select count(*)
from table1 x 
inner join
(select * from table2 where trim(last_name) <> 'unknown') y
using (id1)
where length( trim(x.full_name) ) < 3

请注意,所有字段都是非空字段。对于可能被忽视的内容有什么建议吗?谢谢!

最后的WHERE子句中的

x.full_namex.last_name在整个table上执行。查询优化器可以选择在连接之前或之后执行。看起来,在这种情况下,它是在连接发生之前执行的,所以你会得到一个错误,因为你的 'UNKNOWN' 会导致负子字符串长度的项目还没有被过滤掉。