比较PostgreSQL中的不同数据类型。

时间:2011-12-07 16:00:55

标签: php mysql postgresql

自从我将其中一个转换为PostgreSQL"讯息。

所以,今天的问题如下:

最初的MySQL查询涉及where子句,它们看起来有点如下:

 WHERE id LIKE '%6%' 
 OR createdtime LIKE '%6%' 
 OR modifiedtime LIKE '%6%' 
 OR start_date LIKE '%6%' 
 OR end_date LIKE '%6%' 
 OR sc_related_to LIKE '%6%' 
 OR tracking_unit LIKE '%6%'
 OR message LIKE '%6%'

此查询是系统范围搜索的一部分。在这种情况下,系统正在搜索6,如果我要求它搜索其他内容,比如说user,而不是%6%,我们就会{ {1}}。

现在,问题在于,上述数据类型并不总是字符串。像%user%这样的整数字段和像id这样的日期/时间字段正在与字符串进行比较。在MySQL中,这似乎没问题,但脾气暴躁的PostgreSQL在看到这个查询时会变得脾气暴躁。

我知道对于某些字段,我可以使用createdtime函数,因此,例如,PostgreSQL中的部分子句可能如下所示:

to_char

不幸的是,由于PHP后端,我无法完成查询并将 to_char(id, '999') LIKE '%6%' 添加到每个适用的字段。这就是用于生成to_char子句的PHP代码:

WHERE

注意:它是循环的一部分,因此上面的行生成所有单独的比较。

因此,即使我可以使用 $where .= $tablename.".".$columnname." LIKE '". formatForSqlLike($search_val) ."'"; 进行类型比较,我也无法实现它,因为to_char可能需要针对不同数据类型的特定第二个参数,即使我可以对所有数据类型使用相同的参数,一些数据类型将是字符串,并将字符串传递给to_char会引发错误。

所以,我需要一种方法来让PHP确定列类型并使用正确的to_char(或根本不使用它)或者我需要让PostgreSQL来比较不同的数据-types。

感谢您的所有帮助,祝您有个美好的一天!

1 个答案:

答案 0 :(得分:4)

您可以将所有内容都转换为字符串,例如:

$where .= $tablename.".".$columnname."::text LIKE '". formatForSqlLike($search_val) ."'";

如果您不想更改PHP代码,另一个想法是创建一个执行转换的VIEW,例如:

CREATE OR REPLACE VIEW TableName AS
   SELECT
     createdtime::text,
     modifiedtime::text,
     start_date::text,
     end_date::text,
     sc_related_to::text,
     tracking_unit::text,
     message::text
   FROM RealTable;

然后你的PHP代码只使用这个视图而不是表格,并将所有内容视为文本。

但是,我相信你的技术实际上不会很好地扩展。每次搜索都可能会对整个表进行顺序扫描,因为LIKE子句无法编入索引。

您最好的选择是使用FULLTEXT search index重新设计它,这将更加灵活,闪电般快。