当前位置: 首页 > 面试题库 >

在SQL中使用IN与元组集(SQLite3)

平山
2023-03-14
问题内容

我在SQLite3数据库中具有下表:

CREATE TABLE overlap_results (
neighbors_of_annotation varchar(20),
other_annotation varchar(20),
set1_size INTEGER,
set2_size INTEGER,
jaccard REAL,
p_value REAL,
bh_corrected_p_value REAL,
PRIMARY KEY (neighbors_of_annotation, other_annotation)
);

我想执行以下查询:

SELECT * FROM overlap_results WHERE 
(neighbors_of_annotation, other_annotation)
IN (('16070', '8150'), ('16070', '44697'));

也就是说,我有几个批注ID的元组,我想获取每个这些元组的记录。sqlite3提示给我以下错误:

SQL error: near ",": syntax error

如何正确将其表示为SQL语句?

编辑 我意识到我并没有很好地解释我真正的追求。让我再尝试一下。

如果一个人给我neighbors_of_annotation他们感兴趣的任意术语列表,我可以编写如下的SQL语句:

SELECT * FROM overlap_results WHERE 
neighbors_of_annotation
IN (TERM_1, TERM_2, ..., TERM_N);

但现在假设这个人想给我双方面的,如果形式(TERM_1,1, TERM_1,2)(TERM_2,1, TERM_2,2),…
(TERM_N,1, TERM_N,2),这里TERM_i,1neighbors_of_annotationTERM_i,2other_annotation。SQL语言是否提供同样优雅的方法来为感兴趣的对(元组)制定查询?

最简单的解决方案似乎是为这些对创建一个新表,然后将该表与要查询的表连接起来,并仅选择第一项和第二项匹配的行。创建大量AND / OR语句看起来很可怕,而且容易出错。


问题答案:

我从未见过这样的SQL。如果存在,我会怀疑它是非标准扩展。尝试:

SELECT * FROM overlap_results
WHERE neighbors_of_annotation = '16070'
AND   other_annotation = '8150'
UNION ALL SELECT * FROM overlap_results
WHERE neighbors_of_annotation = '16070'
AND   other_annotation = '44697';

换句话说,从元组构建动态查询,但以一系列的并集或在OR中的一系列AND的形式构建动态查询:

SELECT * FROM overlap_results
WHERE (neighbors_of_annotation = '16070' AND other_annotation =  '8150')
OR    (neighbors_of_annotation = '16070' AND other_annotation = '44697');

因此,代替代码(伪代码,仅在我的脑海中进行测试,因此调试是您的责任),例如:

query  = "SELECT * FROM overlap_results"
query += " WHERE (neighbors_of_annotation, other_annotation) IN ("
sep = ""
for element in list:
    query += sep + "('" + element.noa + "','" + element.oa + "')"
    sep = ","
query += ");"

相反,您会得到类似以下内容的信息:

query  = "SELECT * FROM overlap_results "
sep = "WHERE "
for element in list:
    query += sep + "(neighbors_of_annotation = '" + element.noa + "'"
    query += " AND other_annotation = '" + element.oa + "')"
    sep = "OR "
query += ";"


 类似资料:
  • 问题内容: 假设我有一个表,该表的列的取值范围是1到10。我需要选择除9和10以外的所有值的列。使用此查询时是否会有区别(在性能方面): 和这个? 问题答案: 当涉及到性能,你应该总是分析代码(即运行查询数千次,并使用某种测量每个回路的性能。样品)。 但是在这里,我强烈建议您使用第一个查询来更好地维护将来。逻辑是您需要除9和10之外的所有记录。如果将值11添加到表中并使用第二个查询,则应用程序的逻

  • 问题内容: 我该如何选择: 请不要告诉我可以使用,因为它们实际上来自查询。 问题答案: 没有合并和语法,但是您可以使用,如下所示。 或在评论中使用您的示例

  • 问题内容: 我有和数组两个值,我想在选择查询中将它与sql IN运算符一起使用。 这是我桌子的结构 我有两个值的数组 我想获取comp_id 1和comp_id 2的记录。因此,我编写了以下查询。 但是它不会返回结果。 问题答案: 由于您拥有普通 整数 就可以做到… (由于不断出现,一些其他信息…) 如果使用 字符串 (特别是 不受信任的 )输入,可以做到 但不能处理NULL之类的值。并会添加引号

  • 问题内容: 而不是执行: 在 类似’a%’ 或类似’b%’ 或类似’c%’的地方 从a中选择a,有没有办法执行类似此伪代码的功能? 在 a IN中 从b选择a (’a%’,’b%’,’c%’) __ 问题答案: 可能对于您的示例而言太具体了,但是您可以执行’[ac]%’这样的操作。除此之外,我不知道任何类似LIKE的IN语法

  • 问题内容: 哪种方法更好?使用元组,例如: 或清单,例如: 建议将哪一种用于此类用途,以及为什么使用(出于逻辑和性能考虑)? 问题答案: CPython解释器 将第二种形式替换为第一种形式 。 这是因为从常量加载元组是一个操作,但是列表将是3个操作;加载两个整数内容并构建一个新的列表对象。 由于您使用的是无法到达的列表文字,因此它将替换为元组: 这里第二字节码负载一个元组为常数,在 一个 步骤。将

  • 问题内容: 我们正在尝试为本地sql查询动态生成IN子句以返回JPA实体。Hibernate是我们的JPA提供程序。我们的代码看起来像这样。 这是行不通的,in子句无法识别通过这种方式传入的任何值。有谁知道解决这个问题的方法吗? 问题答案: 在您的情况下,JPA支持命名列表参数: