一尘不染

LIKE (column || '%')

sql

我可以有这样的条件吗:

SELECT * FROM table WHERE ? LIKE (column || '%')

其中,?是字符串参数值。例如,当column等于时,这些 参数值?应返回true/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。不允许吗?
如果不是,是否有任何解决方法?


阅读 261

收藏
2021-03-08

共1个答案

一尘不染

查询:

SELECT * FROM table WHERE ? LIKE (col || '%');

可以改写为(Postgres和MySQL):

SELECT * FROM table WHERE col = left(?, length(col));

如前所述,第一种形式也应该起作用。它可能会非常棘手,但是,因为 有特殊含义的字符
LIKE(至少_%\在列
将不得不逃走。如果希望它与MySQL和Postgres一起使用,则必须在两种实现中都观察到特殊字符。因此,第二种形式在主体上 不易出错

表现

这些查询col都不能在其上使用索引,它们都不是可保留的。可以通过查找给定搜索模式的所有可能前缀来重新评估该问题,可以以?类似的方式对它进行优化

2021-03-08