我是Postgresql的新手。我需要编写一个搜索查询,其中我有一组值,这些值将在包含数组的列中进行搜索。如何搜索至少一个来自我的搜索数组的值存在于列数组。
这是我要搜索的数组,
Array
(
[0] => 24
[1] => 25
[2] => 26
)
&安培;我的表w_business有一个包含以下值的列类别:
["23","45","24"]
["11","34"]
我可以在POSTGRESQL中编写查询以进行搜索吗?
答案 0 :(得分:0)
解决当前问题的最佳机会可能是PHP函数,它返回格式良好的WHERE子句的一部分。但是你的很多会遇到更多麻烦。现在最好的利用时间就是修复该表。
话虽如此,让我们创建一个表和一些示例行。
create temp table scratch (
scratch_id integer primary key,
categories text
);
insert into scratch values (1, '24, 35, 36'); -- Well-formed match
insert into scratch values (2, '23, 24, 35'); -- Well-formed match
insert into scratch values (3, '33, 34, 24'); -- Well-formed match
insert into scratch values (4, '24,35,36'); -- Ill-formed match; no spaces
insert into scratch values (5, '23,24,36'); -- Ill-formed match; no spaces
insert into scratch values (6, '22,23,24'); -- Ill-formed match; no spaces
insert into scratch values (7, '24 , 35 , 36'); -- Ill-formed match
insert into scratch values (8, '23 , 24 , 35'); -- Ill-formed match
insert into scratch values (9, '23 , 24 '); -- Ill-formed match
insert into scratch values (10, ' 24 ,34 '); -- Ill-formed match
insert into scratch values (100, '2424'); -- Well-formed fail
insert into scratch values (101, '1224, 241');-- Well-formed fail
一个返回格式良好的WHERE子句的PHP函数。 (就SQL而言格式良好,就是这样。)这会动态构建一个WHERE子句。 (See this article为什么你不应该这样做。)这种工作的好坏取决于你的数据的一致性。由于数据库设计师已经为风吹起了类型安全性,因此您需要一些运气。 (如果没有类型安全性,您可能会在那里找到类似" 24,25i,wibble"等值。)
function where_clause_for_categories($arr) {
$categories = [];
$patterns = array (
"begin" => '^:val:[, ]',
"middle" => '[, ]:val:[, ]',
"end" => '[, ]:val:$'
);
$full_pattern = "";
foreach ($arr as $value) {
foreach ($patterns as $pattern) {
$full_pattern = str_replace(":val:", $value, $pattern);
array_push($categories, "categories ~ '" . $full_pattern . "'");
}
}
$where = implode(' or ', $categories);
if (strlen($where) > 0) {
$where = '(' . $where . ')';
}
return $where;
}
快速测试。 。
$arr = [24, 25];
echo where_clause_for_categories($arr);
// (categories ~ '^24[, ]' or categories ~ '[, ]24[, ]' or categories ~ '[, ]24$'
or categories ~ '^25[, ]' or categories ~ '[, ]25[, ]' or categories ~ '[, ]25$')
当你把它与WHERE子句的其他部分结合起来时,外部的parens可以防止副作用。
假设您没有将空数组传递给where_clause_for_categories(),您可以将代码的最后一部分更改为此。
echo $qry="SELECT * FROM w_business WHERE enabled='t' AND " . where_clause_for_categories($arr);