如何指定 postgresql 转换为 UUID 的错误行为

How to specify on error behavior for postgresql conversion to UUID

我需要编写一个查询来根据 UUID 字段连接 2 个表。 Table 1 包含 user_uuid 类型的 uuid。 Table 2 在 url 的末尾有这个 user_uuid,在最后一个斜杠之后。 问题是有时这个 url 包含其他值,不能转换为 uuid。

我这样的解决方法非常有效。

LEFT JOIN table2 on table1.user_uuid::text = regexp_replace(table2.url, '.*[/](.*)$', '')

但是我觉得更好的解决方案是在加入之前尝试转换为 uuid。

这里我有一个问题。此类查询:

LEFT JOIN table2 on table1.user_uuid = cast (regexp_replace(table2.url, '.*[/](.*)$', '') as uuid)

给出ERROR: invalid input syntax for type uuid: "rfa-hl-21-014.html" SQL state: 22P02

是否有任何优雅的方法来指定 cast 错误时的行为?我的意思是没有大量的正则表达式检查和 case-when-then-end...

感谢任何帮助和想法。

您可以将 uuid 从 table 1 转换为 text 并将其与 table 2 的后缀连接起来。这永远不会给您带来类型转换错误.

如果您需要快速嵌套循环连接,这可能需要连接条件中的表达式的额外索引。

uuid 转换为文本时还有其他注意事项。 Postgres 将产生标准形式的转换值(小写和连字符)。但是,对于您输入的相同 uuid 值,还有其他格式。例如大写而不是连字符。作为文本,它们不会比较相等,但作为 uuid 它们会。参见 demo here

select * 
  from table1  t1
  join table2  t2
    on replace(t_uuid::text, '-','') = replace(lower(t2.t_stg),'-','') ;  

由于您的数据显然包含非 uuid 值,因此您也不能采用标准 uuid 格式。对于有效的 UUID,还有其他格式(尽管显然不经常使用)。您可能需要查看 UUID Type 文档