写postgresql查询的问题

时间:2014-12-29 11:52:45

标签: php postgresql

我是Postgresql的新手。我需要编写一个搜索查询,其中我有一组值,这些值将在包含数组的列中进行搜索。如何搜索至少一个来自我的搜索数组的值存在于列数组。

这是我要搜索的数组,

Array
(
[0] => 24
[1] => 25
[2] => 26
)

&安培;我的表w_business有一个包含以下值的列类别:

["23","45","24"]
["11","34"]

我可以在POSTGRESQL中编写查询以进行搜索吗?

1 个答案:

答案 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);