如何指定 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 文档
我需要编写一个查询来根据 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 文档