如何正确比较Slick中的选项成员?

jor*_*an3 7 database-design scala optional database-schema slick-2.0

我正在使用地址做事,而成员子预设(公寓/公寓#)导致检索错过.我也担心subpremise是我唯一索引约束的一部分,因为它可以为null.

故障过滤器:

tableQuery.filter(c=> (c.longitude === r.longitude && c.latitude === r.latitude) ||
        (c.streetNumber === r.streetNumber && c.route === r.route && c.subpremise === r.subpremise && c.neighborhoodId === r.neighborhoodId))
Run Code Online (Sandbox Code Playgroud)

成功过滤:(通过removung subpremise)

tableQuery.filter(c=> (c.longitude === r.longitude && c.latitude === r.latitude) ||
            (c.streetNumber === r.streetNumber && c.route === r.route && c.neighborhoodId === r.neighborhoodId)) 
Run Code Online (Sandbox Code Playgroud)

如果还有其他一些我错过的因素,我已经将这些定义包括在下面了,希望它会被注意到.

case class Address(id:Option[Long],streetNumber:Short,route:String,subpremise:Option[String],neighborhoodId:Fk,latitude:Option[Double],longitude:Option[Double])

class Addresses(tag: Tag) extends Table[Address](tag, "addresses") with Logging {
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
  def streetNumber = column[Short]("street_number")
  def route = column[String]("route",O.NotNull)
  def subpremise = column[Option[String]]("subpremise")
  def neighborhoodId = column[Long]("neighborhood",O.NotNull)
  def latitude = column[Option[Double]]("latitude")
  def longitude = column[Option[Double]]("longitude")

  //Constraints
  def idx = index("idx_streetnum_route_subpremise_neighborhood", (streetNumber,route,subpremise,neighborhoodId), unique = true)
  def gps = index("gps", (latitude,longitude), unique = true)

  //Foreign Key
  def neighborhood = foreignKey("NEIGHBORHOOD_FK", neighborhoodId, Neighborhoods.tableQuery)(_.id)

  def * = (id.?,streetNumber,route,subpremise,neighborhoodId,latitude,longitude) <> (Address.tupled,Address.unapply)
}
Run Code Online (Sandbox Code Playgroud)

jor*_*an3 4

答案是使用以下检查。

( //Option Scenario both are defined
  (c.subpremise.isDefined && r.subpremise.isDefined && c.subpremise === r.subpremise) ||
  //Option Scenario both are empty
  (c.subpremise.isEmpty && r.subpremise.isEmpty)
)
Run Code Online (Sandbox Code Playgroud)

  • 这就对了。引用[这个答案](/sf/answers/120709431/):SQL中的“WHERE x=y”实际上意味着“WHERE x is not null and y is not null and x=y”。 (5认同)
  • 您也许可以避免检查`isDefined`:`c.optField === r.optField || (c.optField.isEmpty &amp;&amp; r.optField.isEmpty)` (4认同)
  • 解释“为什么”您需要这些看似多余的检查的答案会很有帮助。希望 Slick/SQL 大师能够出现并提供这样的答案,但我怀疑它必须执行 SQL 的三值逻辑。如果任一值为 NULL,三值逻辑中的相等比较不会返回“true”。 (3认同)