scala - 类似条件的光滑列表映射
问题描述
我有一个表,其中有一列包含值:
column
------
a
ab
abc
b
bc
bca
c
cba
我有一个列表 = [a, b, bc],我想要从列表中的任何元素开始的表中的所有行。
column
------
a
ab
abc
b
bc
bca
我如何使用 slick 形成 queryCondition:
table = TableQuery[Table]
mapping = list map
{
value =>
table.column like value + "%"
}
解决方案
据我了解,您需要以下形式的查询:
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%'
)
所以现在的问题是如何LIKE
从 Scala 列表中构造这些部分。
标准集合库有几种方法可以做到这一点。这是一个(reduceLeft
):
val patterns = Seq("a", "b", "bc").map(_ + "%")
val query = table.filter(row =>
patterns.map(pattern => row.column like pattern).reduceLeft(_ || _)
)
我们正在做的是:
- 将列表
patterns
转换为 Slicklike
表达式列表 - 然后将 Slick 表达式列表与
||
- 这给了我们一个在 a 中使用的 Slick 表达式(
like
s 与 结合or
)filter
。
代替like
,您还可以使用startsWith
避免必须添加%
到您的字符串列表中:
val patterns = Seq("a", "b", "bc")
val query = table.filter(row =>
patterns.map(pattern => row.column startsWith pattern).reduceLeft(_ || _)
)
Slick 会将其转换为 SqlLIKE
表达式。
推荐阅读
- python - 在 django 上实现 Typeahead
- c# - 根据在 ASP.NET 中的链接单击时传递的 Id 加载特定数据
- php - 如何删除旧的缓存图像
- java - 如何在 Spring Rest Client 中获取页面的内容
- android - Angular + Firebase Cloud Messaging (FCM) + Cordova (android) - 如何在 FCM 上注册?
- swift - 如何在同名的方法/属性变量中调用全局函数?
- excel - 如何在 SAS 中打开 .sas7bdat 并导出到 excel?
- vue.js - 带有 vue js 的工作箱
- unity3d - 如何避免 Unity Complie 所有标准着色器变体
- python - Pandas:根据数据和列顺序创建数据框