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;
使用 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;