我在Postgres中使用了简化表:
我想要一个可以在其UUID id或其文本上找到用户的查询uid.
SELECT * FROM user
WHERE id = 'jsdfhiureeirh' or uid = 'jsdfhiureeirh';
Run Code Online (Sandbox Code Playgroud)
我的查询生成一个,invalid input syntax for uuid因为我显然没有在这个实例中使用UUID.
如何优化此查询或检查该值是否为有效的UUID?
Wai*_*age 45
找到了!转换UUID列以::text停止错误.不确定性能是否打击,但在大约5000行上我得到的性能不仅仅是足够的.
SELECT * FROM user
WHERE id::text = 'jsdfhiureeirh' OR uid = 'jsdfhiureeirh';
SELECT * FROM user
WHERE id::text = '33bb9554-c616-42e6-a9c6-88d3bba4221c'
OR uid = '33bb9554-c616-42e6-a9c6-88d3bba4221c';
Run Code Online (Sandbox Code Playgroud)
我最初误解了这个问题。如果您想“安全地”尝试将字符串强制转换为UUID,则可以编写一个函数来捕获invalid_text_representation异常并返回null(从对另一个问题的答案进行了修改):
CREATE OR REPLACE FUNCTION uuid_or_null(str text)
RETURNS uuid AS $$
BEGIN
RETURN str::uuid;
EXCEPTION WHEN invalid_text_representation THEN
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
SELECT uuid_or_null('INVALID') IS NULL然后将导致true。
换句话说(鉴于(true or null) = true),
SELECT * FROM user
WHERE id = uuid_or_null('FOOBARBAZ') OR uid = 'FOOBARBAZ';
Run Code Online (Sandbox Code Playgroud)
原始答案:
Postgres会自动为您将字符串转换为UUID,但是您需要使用有效的UUID。例如:
SELECT * FROM user
WHERE id = '5af75c52-cb8e-44fb-93c8-1d46da518ee6' or uid = 'jsdfhiureeirh';
Run Code Online (Sandbox Code Playgroud)
您还可以让Postgres使用DEFAULT带有扩展uuid_generate_v4()功能的子句为您生成UUID uuid-ossp:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE user (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
uid TEXT,
name TEXT
);
Run Code Online (Sandbox Code Playgroud)
您可以使用正则表达式进行检查:
SELECT *
FROM user
WHERE ('jsdfhiureeirh' ~ E'^[[:xdigit:]]{8}-([[:xdigit:]]{4}-){3}[[:xdigit:]]{12}$'
AND id = 'jsdfhiureeirh')
OR uid = 'jsdfhiureeirh';
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36169 次 |
| 最近记录: |