如何使用连接表检查房间查询中的空参数?
Posted
技术标签:
【中文标题】如何使用连接表检查房间查询中的空参数?【英文标题】:how to check null parameter in room queries with joined tables? 【发布时间】:2021-11-11 10:44:58 【问题描述】:我正在尝试使用带有 SQLite 的 Room 库和带有此查询的 kotlin 获取数据,但我有 2 个可空参数与连接表,我不知道如何检查它们是否为空。 我想看看它们是否为空,然后返回空,如果它们不为空,则返回参数,但我正在使用这个查询 RN,问题是只有当所有参数(甚至可以为空的参数)都不为空时,查询才返回数据。 这是我的查询
@Query(
"SELECT " +
"f.word AS from_word, " +
"f.word_id as from_word_id, " +
"f2.word AS from_word2, " +
"f2.word_id as from_word_id2, " +
"fl.language AS from_language, " +
"fl.language_id AS from_language_id, " +
"t.word AS to_word, " +
"t.word_id AS to_word_id, " +
"t2.word AS to_word2, " +
"t2.word_id AS to_word_id2, " +
"tl.language AS to_language, " +
"tl.language_id AS to_language_id, " +
"time, " +
"date, " +
"day_of_week AS dayOfWeek, " +
"country, " +
"city, " +
"bookmarked " +
"FROM word_translate_map " +
"JOIN word AS f ON from_word_map = f.word_id " +
"JOIN word AS t ON to_word_map = t.word_id " +
"JOIN word AS f2 ON from_word_map2 = f2.word_id " +
"JOIN word AS t2 ON to_word_map2 = t2.word_id " +
"JOIN language AS fl ON f.language_map = fl.language_id " +
"JOIN language AS tl ON t.language_map = tl.language_id "
)
abstract fun getAllTranslatedWords(): LiveData<List<TranslatedWord>>
这是我的桌子,我有问题。
@Entity(
tableName = "word_translate_map",
primaryKeys = ["from_word_map","to_word_map"],
foreignKeys = [
ForeignKey(
entity = Word::class,
parentColumns = ["word_id"],
childColumns = ["from_word_map"],
onDelete = ForeignKey.CASCADE,
onUpdate = ForeignKey.CASCADE
),
ForeignKey(
entity = Word::class,
parentColumns = ["word_id"],
childColumns = ["to_word_map"],
onDelete = ForeignKey.CASCADE,
onUpdate = ForeignKey.CASCADE
)
],
indices = [
Index("to_word_map")
]
)
data class WordTranslateMap(
@ColumnInfo(name = "from_word_map")
val fromWord: Long,
@ColumnInfo(name = "to_word_map")
val toWord: Long,
@ColumnInfo(name = "from_word_map2")
val fromWord2: Long?,
@ColumnInfo(name = "to_word_map2")
val toWord2: Long?,
@ColumnInfo(name = "time")
val time: String,
@ColumnInfo(name = "date")
val date: String,
@ColumnInfo(name = "country")
val country: String,
@ColumnInfo(name = "city")
val city: String,
@ColumnInfo(name = "day_of_week")
val dayOfWeek: String,
@ColumnInfo(name = "bookmarked")
val bookmarked: Boolean
)
这也是我的模型(如果你需要这个)
data class TranslatedWord(
val from_word: String,
val from_word2: String?,
val from_language: String,
val to_word: String,
val to_word2: String?,
val to_language: String,
val time: String,
val date: String,
val country: String,
val city: String,
val dayOfWeek: String,
val bookmarked: Boolean
)
【问题讨论】:
【参考方案1】:我认为您可以对连接进行双重验证,是否可以在哪里选择所有为空或匹配条件的字段,例如:
WHERE (:t2 IS NULL OR :t2 = :t1)
我的猜测是您可以在连接上实现相同的操作,例如:
JOIN word AS f ON (from_word_map = f.word_id OR from_word_map IS NULL)
您可以执行进一步的验证(例如检查两个字段是否为 null 以确实返回 null)嵌套和。
【讨论】:
如何知道返回 null? null 的返回值是什么?是 0 吗? 我将返回具有空值的行。如果要避免具有空值的行,可以检查“IS NOT NULL”以上是关于如何使用连接表检查房间查询中的空参数?的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 ASP.NET SqlDataSource 中的空 CONTAINS() 查询参数?