【问题标题】:How to use the sqlite3 functions CREATE TABLE AS SELECT, MAX, CASE, and AS in conjunction?sqlite3函数CREATE TABLE AS SELECT、MAX、CASE、AS如何配合使用?
【发布时间】:2021-01-15 11:11:59
【问题描述】:

我正在尝试在 sqlite3 中编写一个查询,它将在我的数据库表中搜索匹配项,然后根据是否找到匹配项来创建一个列。

这是我的代码的样子:

import sqlite3
conn = sqlitet3.connect('mydatabase.db')
cur  = conn.cursor()

query = '''
CREATE TABLE test AS SELECT
identifier,
MAX(CASE WHEN identifier == "ABC123" THEN 1 ELSE 0 AS id_flag)
'''

cur.execute(query)
print(cur.fetchone())

MAX 语句旨在折叠重复值。例如,如果有两行标识符为 ABC123,则查询将搜索 id_flags 的最大值并仅输出具有该标识符的一行。

因此,我的预期输出(以及我用常规 SQL 编写时的输出)大致如下:

Identifier     id_flag
XYZ234         0
ABC123         1
QRS789         0

这给出了“接近“AS””的语法错误。

如果我删除 AS 部分(以及之后的 id_flag)并运行代码,则语法错误会移动到“near”)“”。

如果我删除括号,则语法错误会移动到“靠近“CASE””。

我查看了sqlite3 syntax flowchart,但我不知道如何构造这个查询并且没有遇到语法错误。

感谢您的帮助!

【问题讨论】:

  • ...将在我的数据库表中搜索匹配...哪个表?发布示例数据。

标签: python sql sqlite select create-table


【解决方案1】:

您的查询缺少FROM 子句和GROUP BY 子句。假设您有一个源表(例如 src),并且您希望每个不同的 identifier 有一行,以及指示是否存在重复的列。

那就是:

create table test as
select identifier, count(*) > 1 as id_flag
from src
group by identifier

【讨论】:

    【解决方案2】:

    如果您想检查所有行,如果列 identifier 等于 'ABC123',那么这是如何做到的:

    SELECT DISTINCT identifier, identifier = 'ABC123' id_flag
    FROM tablename  
    

    【讨论】:

      猜你喜欢
      • 2013-06-29
      • 2010-11-27
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 2020-02-08
      • 2013-12-27
      • 1970-01-01
      • 2013-12-07
      相关资源
      最近更新 更多