所以,今天的问题如下:
最初的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。
感谢您的所有帮助,祝您有个美好的一天!
答案 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重新设计它,这将更加灵活,闪电般快。