Android Sqlite-条件选择?
我有一张有语言的桌子 我想做一个查询,用指定的语言获取行,但如果它不返回任何数据,则使用默认语言 这可以在一个查询中完成吗 更新: 我的桌子:语言 字段: id-主键,唯一 朗文,不是唯一的 内容-文本,不是唯一的 我现在的问题是:Android Sqlite-条件选择?,android,sql,sqlite,Android,Sql,Sqlite,我有一张有语言的桌子 我想做一个查询,用指定的语言获取行,但如果它不返回任何数据,则使用默认语言 这可以在一个查询中完成吗 更新: 我的桌子:语言 字段: id-主键,唯一 朗文,不是唯一的 内容-文本,不是唯一的 我现在的问题是: SELECT * FROM Languages WHERE (id='1') AND (lang = 'es') 如前所述,如果上述查询不返回任何内容,我希望从默认语言中获得结果: SELECT * FROM Languages WHERE (id='1') A
SELECT * FROM Languages WHERE (id='1') AND (lang = 'es')
如前所述,如果上述查询不返回任何内容,我希望从默认语言中获得结果:
SELECT * FROM Languages WHERE (id='1') AND (lang = 'en')
SELECT * FROM languages WHERE id = '1' AND lang IN
(SELECT lang FROM languages WHERE id = '1' AND lang IN ('es', 'en')
ORDER BY lang = 'es' LIMIT 1)
在本例中,“en”是默认语言。类似以下内容:
SELECT *
FROM lang_tbl
WHERE lang_tbl.name = "search_lang" OR lang_tbl.name = "default_lang"
ORDER BY lang_tbl.name = "search_lang" DESC
LIMIT 1;
(SELECT CASE
WHEN ((SELECT ID FROM table WHERE language = specified language) IS NULL)
THEN
default language
ELSE
specified language
END);
它将根据子查询的结果返回所需的语言。将其插入最终查询的WHERE子句。根据主键约束,在您的示例中,两行的id值1不相同,因此传递WHERE id='1'可能是您的问题。如果没有两行具有相同的lang值,则可以完全省略id子句,例如:
SELECT * FROM Languages WHERE lang='en'
借助yko答案中的逻辑,这将分离出使用哪种语言的决定,然后返回该语言的所有行:
SELECT * FROM Languages WHERE (id='1') AND (lang = 'en')
SELECT * FROM languages WHERE id = '1' AND lang IN
(SELECT lang FROM languages WHERE id = '1' AND lang IN ('es', 'en')
ORDER BY lang = 'es' LIMIT 1)
你能描述一下你的桌子吗?如果id是表语言的主键,那么您的查询就没有任何意义了。它只能返回一条记录。是的,你们是对的,但我发布的表就是一个例子。我使用的实际表格更复杂。我使用这个人工示例表只是为了提供我可以设置实际问题的依据。OP想要获得“首选或默认”语言,这应该可以解决问题。这仅在有一行要返回时有效。在我的情况下,语言不是唯一的。我误解了你的问题,对不起。但如果是这样,最好使用两个查询:从langs中选择count*,其中name=search\u lang,并根据返回值使用所需的lang或默认值执行完整的值选择。我认为这不是SQLite语法。我不确定更新是否是SQL语法-CASE通常提供标量值,而不是行集。我要去检查这是否是我不知道的SQL。如果您想使用用例,我认为可以在WHERE部分确定要与哪种语言进行比较。然后您可以修改上述查询以返回该语言的标量,然后将该语言标量插入您选择的查询的WHERE子句中。请参阅和我的新更新。显然,它们具有相同的值,因为这是OP指定的值。这看起来像是一个本地化表,id在其中指定一个短语或多个短语并指定翻译。此外,您的查询永远不会返回首选行集(西班牙语中的行)。根据OP:id-primary key,unique似乎表示其唯一,并且主键约束将指示不存在重复的行。但是他一直在改变他的问题,所以让我们看看在接下来的20分钟里问题会发展到什么程度。嘿,你说得对!我错过了PK的定义。有了PK,整个问题就没有意义了——你永远不需要超过WHERE子句中的id来获得一行。因为子查询被1限制,我们可以用lang=替换lang in,对吗?像这样,从id='1'和lang=的语言中选择*和lang,从id='1'和'es'中选择lang,'en'ORDER BY lang='es'LIMIT 1Yes,这在逻辑上看起来是正确的-只要SQlite认识到LIMIT 1返回标量值,它就应该工作。