代码之家  ›  专栏  ›  技术社区  ›  Wainage

Postgres选择UUID或字符串的位置

  •  79
  • Wainage  · 技术社区  · 7 年前

    • 用户模型
      • id(UUID)
      • 名称(varchar)

    id 或其文本 uid

    SELECT * FROM user
    WHERE id = 'jsdfhiureeirh' or uid = 'jsdfhiureeirh';
    

    我的查询生成一个 invalid input syntax for uuid

    4 回复  |  直到 5 年前
        1
  •  154
  •   Wainage    7 年前

    ::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';
    
        2
  •  24
  •   Josh Bowden    7 年前

    我最初误解了这个问题。如果您想“安全地”尝试将字符串强制转换为UUID,可以编写一个函数来捕捉 invalid_text_representation null ( modified from an answer to a different question ):

    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;
    

    SELECT uuid_or_null('INVALID') IS NULL 然后将导致 true .

    换句话说(考虑到 (true or null) = true

    SELECT * FROM user
    WHERE id = uuid_or_null('FOOBARBAZ') OR uid = 'FOOBARBAZ';
    

    原始答案:

    Postgres会自动将字符串转换为UUID,但您需要使用有效的UUID。 例如:

    SELECT * FROM user
    WHERE id = '5af75c52-cb8e-44fb-93c8-1d46da518ee6' or uid = 'jsdfhiureeirh';
    

    DEFAULT 带有的子句 uuid_generate_v4() 通过使用 uuid-ossp

    CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
    
    CREATE TABLE user (  
       id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
       uid TEXT,
       name TEXT
    );
    
        3
  •  10
  •   Laurenz Albe    7 年前

    可以使用正则表达式进行检查:

    SELECT *
    FROM user
    WHERE ('jsdfhiureeirh' ~ E'^[[:xdigit:]]{8}-([[:xdigit:]]{4}-){3}[[:xdigit:]]{12}$'
           AND id = 'jsdfhiureeirh')
          OR uid = 'jsdfhiureeirh';
    
        4
  •  3
  •   neko    3 年前

    代替使用::text,使用cast(uid作为文本),并在该表达式上构建索引,然后Postgres重新识别它以进行非常快速的查询。我们这样做是为了切分/分区构建这样的索引

    使用btree((right(cast(id as text),2)))在上创建索引idx_partition256;

    JPA中的查询可能是

    其中函数(右转换(id为文本),2)在()