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

Php 比较PostgreSQL中的不同数据类型。,php,mysql,postgresql,Php,Mysql,Postgresql,我已经有一段时间没有发表“将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 trac

我已经有一段时间没有发表“将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后端的原因,我不能仅仅通过查询将
添加到每个适用的字段中。生成
WHERE
子句的PHP代码如下所示:

 $where .= $tablename.".".$columnname." LIKE '". formatForSqlLike($search_val) ."'";
注意:它是循环的一部分,因此上面的一行生成所有单独的比较

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

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


谢谢你的帮助,祝你有愉快的一天

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

$where .= $tablename.".".$columnname."::text LIKE '". formatForSqlLike($search_val) ."'";
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代码,另一个想法是创建一个执行强制转换的
视图
,例如:

$where .= $tablename.".".$columnname."::text LIKE '". formatForSqlLike($search_val) ."'";
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
子句不能被索引


您最好的选择是使用a重新设计它,这将是一种更通用、更迅雷不及掩耳的方式。

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

$where .= $tablename.".".$columnname."::text LIKE '". formatForSqlLike($search_val) ."'";
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代码,另一个想法是创建一个执行强制转换的
视图
,例如:

$where .= $tablename.".".$columnname."::text LIKE '". formatForSqlLike($search_val) ."'";
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
子句不能被索引


您最好的选择是使用a重新设计它,这将是一种更通用、更迅雷不及掩耳的方式。

日期
列使用这样的选项有什么意义?我不知道……我没有编写代码:(我猜,它的存在是为了让用户搜索一个日期,它可以得到一些结果,但我不知道
LIKE
如何处理
日期
PostgreSQL在看到这个查询时变得暴躁,
…这很好地说明了PosgresSQL。哦,Postgres很好,它只是没有mySQL那么愚蠢。这有什么意义是否要对
日期
列使用LIKE?我不知道…我没有编写代码:(我猜,它的存在是为了让用户搜索一个日期,它可以得到一些结果,但我不知道
LIKE
如何处理
日期
PostgreSQL在看到这个查询时变得暴躁,
…这很好地说明了PosgresSQL。哦,Postgres很好,它只是没有mySQL那么愚蠢。哦,天哪,谢谢你的支持。)至少。我真傻,没有试着这么做。
全文搜索
似乎很有趣,但不幸的是,在这个系统中实现它可能会非常耗时和痛苦。然而,如果我不得不从头开始设计搜索,我会记住这一点。是的!但至少现在你可以打开它了如果你使用符合标准的演员阵容(colname作为文本)然后你也会有更少的移植工作要做。哦,天哪,谢谢你。我真傻,没有试着这样铸造它。
全文搜索
看起来很有趣,但不幸的是,在这个系统中实现它可能会非常耗时和痛苦。但是,如果我不得不这样做,我会记住这一点从零开始进行搜索。是的!但至少现在你可以将其升级到最强大的功能,当一切崩溃时,告诉他们你是这么说的。如果你使用符合标准的CAST(colname作为文本),那么你需要做的移植工作也会减少。