如何使用连接表检查房间查询中的空参数?

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”

以上是关于如何使用连接表检查房间查询中的空参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 SQLite 查询的空绑定?

检查 django 中的空查询集

如何检查游标中的空结果? (烧瓶+ pymysql)

如何处理 ASP.NET SqlDataSource 中的空 CONTAINS() 查询参数?

如何使用 Oracle SQL 约束检查酒店房间是不是已预订

Postgres查询以查找连接表中是不是已存在组合