我可以有这样的条件吗:
SELECT * FROM table WHERE ? LIKE (column || '%')
哪里的?
是一个字符串参数值。例如,这些参数值?
当列等于时应返回 true/admin/products
/admin/products/1
/admin/products/new
/admin/products/1/edit
这可能吗?
Update:添加了测试用例。
基本上,where 子句将呈现如下:
1. ? LIKE (column || '%')
2. '/admin/products/1' like ('/admin/products' || %)
3. '/admin/products/1' like ('/admin/products%')
但它对我来说总是返回 false。
这些查询工作正常:
column = '/admin/products' --returns true
column = '/admin/products/1' --returns false
column LIKE '/admin/prod%' --returns true
当我输入参数时出现问题?
之前LIKE
条款。难道不允许吗?
如果不是,有什么解决方法吗?
查询:
SELECT * FROM table WHERE ? LIKE (col || '%');
可以重写为(Postgres 和 MySQL):
SELECT * FROM table WHERE col = left(?, length(col));
正如所评论的,第一种形式应该也有效。但这可能很棘手,因为具有特殊意义的字符 for LIKE http://www.postgresql.org/docs/current/interactive/functions-matching.html#FUNCTIONS-LIKE(至少_%\
) 在专栏中必须逃脱。如果您希望它同时适用于 MySQL 和 Postgres,则必须遵守两种实现中的特殊字符。所以第二种形式是更不易出错原则上。
表现
这些查询都不能使用索引col
,两者都不是sargable http://en.wikipedia.org/wiki/Sargable。该问题可以重新评估为找到给定搜索模式的所有可能的前缀?
,可以以类似的方式进行优化,如 dba.SE 上的相关答案(针对 Postgres):
- 寻找最长前缀的算法 https://dba.stackexchange.com/a/43444/3684
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)