【问题标题】:Comparing different data-types in PostgreSQL.比较 PostgreSQL 中的不同数据类型。
【发布时间】:2011-12-08 01:07:15
【问题描述】:

我已经有一段时间没有发表“将 MySQL 转换为 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%,我们就会有%user%

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

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

 to_char(id, '999') LIKE '%6%' 

不幸的是,由于 PHP 后端,我不能只完成查询并将 to_char 添加到每个适用字段。这是生成 WHERE 子句的 PHP 代码的样子:

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

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

所以,即使我可以绕过与to_char 的类型比较,我也无法实现它,因为to_char 可能需要针对不同数据类型的特定第二个参数,即使我可以使用相同的参数对于所有数据类型,一些数据类型将是字符串,将字符串传递给to_char 会引发错误。

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

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

【问题讨论】:

  • date 列使用 LIKE 有什么意义?
  • 我不知道...我没有编写代码。 :( 我想,它的存在是为了如果用户搜索一个日期,它可以得到一些结果,但我不知道LIKEdates 的工作情况如何。
  • PostgreSQL gets grumpy when it sees this query... 很适合 PosgresSQL。
  • 哦,Postgres 很好,只是它不像 mySQL 那样愚蠢。

标签: php mysql postgresql


【解决方案1】:

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

$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 重新设计它,这将更加通用且速度快。

【讨论】:

  • 天哪,谢谢。我不尝试那样铸造它是愚蠢的。 FULLTEXT search 看起来很有趣,但不幸的是,在这个系统中实现它可能会非常耗时和痛苦。但是,如果我必须从头开始设计搜索,我会牢记这一点。
  • 是的!但至少现在你可以把它发挥到极致,当一切都崩溃时,你告诉他们是这样的。
  • 如果您使用符合标准的 CAST(colname AS text),那么您要做的移植工作也会更少。
猜你喜欢
  • 2021-06-11
  • 2019-08-06
  • 2016-02-09
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
相关资源
最近更新 更多