Hstore 使用通配符搜索值

Hstore search on values with wildcard

使用 PostgreSQL,我希望能够在 HStore 字段中找到所有键值对,其中 value 与给定查询匹配。因此,例如,给定如下所示的 table:

Name        Parentage (Hstore)
_____       ___________________
Rover       Mother => Yellow Lab, Father => Black Lab
Fido        Mother => Black Lab, Father => Rottweiler
Rex         Mother => Labrador Retriever, Father => Springer Spaniel 
Lassie      Mother => Border Collie, Father => Collie

我如何查询其家谱中具有“%lab%”的任何狗? IE。搜索会出现 Rover、Fido 和 Rex,但不会出现 Lassie。我见过的唯一示例是在单个键内进行搜索 - 我需要在允许通配符的所有值内进行搜索。

我看过 this 类似的问题,但它似乎只对特定键进行搜索,而不是对所有键的 Hstore 字段中找到的所有值进行搜索。

请注意,这是一个构造示例,我试图使其易于访问。在我的实际数据库中,我有语言代码键,后跟相同单词在不同语言中的翻译值。我需要能够执行可以命中任何值的搜索,无论它使用何种语言。

将 hstore 分成 name/parent 行,然后 select 行 父列符合您的搜索条件的狗的名字。

根据您实际数据的性质,这可能需要额外的 指标。我不会为此使用 hstore,但您的实际数据可能 与众不同。

% psql -qe -f hstore.sql
begin;
create extension hstore;
create temp table dogs (
    "name" text,
    parentage hstore
);
insert into dogs values
('Rover', 'Mother => "Yellow Lab",Father => "Black Lab"')
,('Fido', 'Mother => "Black Lab",Father => "Rottweiler"')
,('Rex', 'Mother => "Labrador Retriever",Father => "Springer Spaniel"')
,('Lassie', 'Mother => "Border Collie",Father => "Collie"')
;
table dogs;
  name  |                          parentage                           
--------+--------------------------------------------------------------
 Rover  | "Father"=>"Black Lab", "Mother"=>"Yellow Lab"
 Fido   | "Father"=>"Rottweiler", "Mother"=>"Black Lab"
 Rex    | "Father"=>"Springer Spaniel", "Mother"=>"Labrador Retriever"
 Lassie | "Father"=>"Collie", "Mother"=>"Border Collie"
(4 rows)

select * from dogs where "name" in
(select distinct "name" from (
            select "name", unnest(avals(parentage)) as parent
        ) as plist
        where parent ilike '%lab%'
);
 name  |                          parentage                           
-------+--------------------------------------------------------------
 Rover | "Father"=>"Black Lab", "Mother"=>"Yellow Lab"
 Fido  | "Father"=>"Rottweiler", "Mother"=>"Black Lab"
 Rex   | "Father"=>"Springer Spaniel", "Mother"=>"Labrador Retriever"
(3 rows)

rollback;