在 Slick 中使用 DB 函数(TRIM(列中的前导“0”))
Using DB Function (TRIM(LEADING '0' from column)) in Slick
我想将 SQL 查询翻译成 TableQuery
:
SELECT ..., TRIM(LEADING '0' FROM mycolumn) FROM mytable WHERE TRIM(LEADING '0' FROM mycolumn) = '$key
应该变成MyTableQuery.filter(<_.mycolumn something something> )
我不能使用 implicit MappedColumnType
,因为我正在从 String
映射到 String
,结果中还有其他 String
列。我不知道如何在 SELECT
和 WHERE
中使用它
对于 SELECT
部分,我创建了一个自定义函数来将结果元组映射到我的案例 class,因此我只需要 WHERE
部分的解决方案。
已阅读文档中的 Coming from SQL and User defined features,但不幸的是,我 none 更聪明。我想我可以使用 SimpleFunction.unary[String, String]
但还不知道如何使用。
我会 trim 一个普通的 String
和 dropLeft
,但是 Rep[String]
没有这样的方法。 ltrim
不接受参数。 endsWith
对我来说是模棱两可的。
我无法填充我的查询 String
,因为并非数据库中的所有值都被填充并且具有不同的长度。
我绝对可以使用普通的 SQL 并映射结果,但我真的很想了解我在这里缺少什么。
我正在使用 Slick 3.1.1
TRIM(LEADING 意味着您必须放弃使用 SimpleExpression 并使用可让您访问的 QueryBuilder 的稍微奇怪的语法。
val trimLeading = SimpleExpression.binary[String, String, String] {
(trimChar, str, queryBuilder) =>
import slick.util.MacroSupport._
import queryBuilder._
b"TRIM(LEADING $trimChar FROM $str)"
}
这是一个练习它的例子
import com.typesafe.config.ConfigFactory
import slick.backend.DatabaseConfig
import slick.driver.JdbcProfile
import scala.concurrent.duration.Duration
import scala.concurrent.Await
object TrimLeading extends App {
def trimLeadingExample(dbConfig: DatabaseConfig[JdbcProfile]): Unit = {
import dbConfig.driver.api._
val trimLeading = SimpleExpression.binary[String, String, String] {
(trimChar, str, queryBuilder) =>
import slick.util.MacroSupport._
import queryBuilder._
b"TRIM(LEADING $trimChar FROM $str)"
}
class ZeroTable(tag: Tag) extends Table[String](tag, "ZeroTable") {
def zeros = column[String]("zeros")
def * = zeros
}
val zeroTable = TableQuery[ZeroTable]
exec(zeroTable.schema.create)
exec(zeroTable ++= Seq("000000x", "00x", "000000000x", "00000x", "00xx"))
exec(zeroTable.
filter(s => trimLeading("0", s.zeros) === "x").
map(s => trimLeading("0", s.zeros)).result).foreach(println)
exec(zeroTable.schema.drop)
def exec[T](action: DBIO[T]): T = Await.result(dbConfig.db.run(action), Duration.Inf)
}
val configStr =
"""
| driver = "freeslick.OracleProfile$"
| db {
| driver = oracle.jdbc.OracleDriver
| url="jdbc:oracle:thin:@//localhost:49161/xe"
| properties = {
| databaseName = "freeslicktest"
| user = "system"
| password = "oracle"
| }
| }
""".stripMargin
trimLeadingExample(DatabaseConfig.forConfig[JdbcProfile]("", ConfigFactory.parseString(configStr)))
}
从日志中,语句是
*** (s.jdbc.JdbcBackend.statement) Preparing statement: select TRIM(LEADING '0' FROM "zeros") from "ZeroTable" where TRIM(LEADING '0' FROM "zeros") = 'x'
我想将 SQL 查询翻译成 TableQuery
:
SELECT ..., TRIM(LEADING '0' FROM mycolumn) FROM mytable WHERE TRIM(LEADING '0' FROM mycolumn) = '$key
应该变成MyTableQuery.filter(<_.mycolumn something something> )
我不能使用 implicit MappedColumnType
,因为我正在从 String
映射到 String
,结果中还有其他 String
列。我不知道如何在 SELECT
和 WHERE
对于 SELECT
部分,我创建了一个自定义函数来将结果元组映射到我的案例 class,因此我只需要 WHERE
部分的解决方案。
已阅读文档中的 Coming from SQL and User defined features,但不幸的是,我 none 更聪明。我想我可以使用 SimpleFunction.unary[String, String]
但还不知道如何使用。
我会 trim 一个普通的 String
和 dropLeft
,但是 Rep[String]
没有这样的方法。 ltrim
不接受参数。 endsWith
对我来说是模棱两可的。
我无法填充我的查询 String
,因为并非数据库中的所有值都被填充并且具有不同的长度。
我绝对可以使用普通的 SQL 并映射结果,但我真的很想了解我在这里缺少什么。
我正在使用 Slick 3.1.1
TRIM(LEADING 意味着您必须放弃使用 SimpleExpression 并使用可让您访问的 QueryBuilder 的稍微奇怪的语法。
val trimLeading = SimpleExpression.binary[String, String, String] {
(trimChar, str, queryBuilder) =>
import slick.util.MacroSupport._
import queryBuilder._
b"TRIM(LEADING $trimChar FROM $str)"
}
这是一个练习它的例子
import com.typesafe.config.ConfigFactory
import slick.backend.DatabaseConfig
import slick.driver.JdbcProfile
import scala.concurrent.duration.Duration
import scala.concurrent.Await
object TrimLeading extends App {
def trimLeadingExample(dbConfig: DatabaseConfig[JdbcProfile]): Unit = {
import dbConfig.driver.api._
val trimLeading = SimpleExpression.binary[String, String, String] {
(trimChar, str, queryBuilder) =>
import slick.util.MacroSupport._
import queryBuilder._
b"TRIM(LEADING $trimChar FROM $str)"
}
class ZeroTable(tag: Tag) extends Table[String](tag, "ZeroTable") {
def zeros = column[String]("zeros")
def * = zeros
}
val zeroTable = TableQuery[ZeroTable]
exec(zeroTable.schema.create)
exec(zeroTable ++= Seq("000000x", "00x", "000000000x", "00000x", "00xx"))
exec(zeroTable.
filter(s => trimLeading("0", s.zeros) === "x").
map(s => trimLeading("0", s.zeros)).result).foreach(println)
exec(zeroTable.schema.drop)
def exec[T](action: DBIO[T]): T = Await.result(dbConfig.db.run(action), Duration.Inf)
}
val configStr =
"""
| driver = "freeslick.OracleProfile$"
| db {
| driver = oracle.jdbc.OracleDriver
| url="jdbc:oracle:thin:@//localhost:49161/xe"
| properties = {
| databaseName = "freeslicktest"
| user = "system"
| password = "oracle"
| }
| }
""".stripMargin
trimLeadingExample(DatabaseConfig.forConfig[JdbcProfile]("", ConfigFactory.parseString(configStr)))
}
从日志中,语句是
*** (s.jdbc.JdbcBackend.statement) Preparing statement: select TRIM(LEADING '0' FROM "zeros") from "ZeroTable" where TRIM(LEADING '0' FROM "zeros") = 'x'