我可以有这样的条件吗:
SELECT * FROM table WHERE ? LIKE (column || '%')
其中,?是字符串参数值。例如,当column等于时,这些 参数值?应返回true/admin/products
?
/admin/products
/admin/products/1 /admin/products/new /admin/products/1/edit
这可能吗?
更新: 添加了测试用例。
基本上,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。不允许吗? 如果不是,是否有任何解决方法?
LIKE
查询:
SELECT * FROM table WHERE ? LIKE (col || '%');
可以改写为(Postgres和MySQL):
SELECT * FROM table WHERE col = left(?, length(col));
如前所述,第一种形式也应该起作用。它可能会非常棘手,但是,因为 有特殊含义的字符 的LIKE(至少_%\) 在列 将不得不逃走。如果希望它与MySQL和Postgres一起使用,则必须在两种实现中都观察到特殊字符。因此,第二种形式在主体上 不易出错 。
_%\
这些查询col都不能在其上使用索引,它们都不是可保留的。可以通过查找给定搜索模式的所有可能前缀来重新评估该问题,可以以?类似的方式对它进行优化
col