我有一个表,其中的列包含值:
column
------
a
ab
abc
b
bc
bca
c
cba
我有一个列表= [a,b,bc],我希望表中的所有行都从列表中的任何元素开始。
column
------
a
ab
abc
b
bc
bca
如何使用光滑的形式形成queryCondition:
table = TableQuery[Table]
mapping = list map
{
value =>
table.column like value + "%"
}
答案 0 :(得分:1)
据我所知,您希望查询以下形式:
SELECT column FROM table WHERE
column LIKE 'a%'
OR column LIKE 'b%'
OR column LIKE 'bc%'
基本上翻译成Slick:
val query = table.filter(row =>
row.column like 'a%' || row.column like 'b%' || row.column like 'bc%'
)
所以现在的问题是如何从Scala列表构造LIKE
部分。
标准馆藏库有几种方法可以做到这一点。这是一个(reduceLeft
):
val patterns = Seq("a", "b", "bc").map(_ + "%")
val query = table.filter(row =>
patterns.map(pattern => row.column like pattern).reduceLeft(_ || _)
)
我们正在做的是:
patterns
的列表转换为Slick like
表达式的列表||
组合like
与or
结合使用)在filter
内部使用。您也可以使用like
代替startsWith
,以避免将%
添加到字符串列表中:
val patterns = Seq("a", "b", "bc")
val query = table.filter(row =>
patterns.map(pattern => row.column startsWith pattern).reduceLeft(_ || _)
)
Slick会将其转换为Sql LIKE
表达式。