Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Sqlite-条件选择?_Android_Sql_Sqlite - Fatal编程技术网

Android Sqlite-条件选择?

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

我有一张有语言的桌子

我想做一个查询,用指定的语言获取行,但如果它不返回任何数据,则使用默认语言

这可以在一个查询中完成吗

更新:

我的桌子:语言 字段:

id-主键,唯一

朗文,不是唯一的

内容-文本,不是唯一的

我现在的问题是:

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返回标量值,它就应该工作。