Как использовать функции sqlite3 для СОЗДАНИЯ ТАБЛИЦЫ КАК SELECT, MAX, CASE и AS в сочетании?

#python #sql #sqlite #select #create-table

#python #sql #sqlite #выберите #create-table

Вопрос:

Я пытаюсь написать запрос в 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 (и id_flag впоследствии) и выполню код, синтаксическая ошибка переместится на «рядом») «».

Если я удалю круглые скобки, синтаксическая ошибка переместится на «рядом с»РЕГИСТРОМ»».

Я просмотрел блок-схему синтаксиса sqlite3, но я не могу понять, как структурировать этот запрос и не получить синтаксическую ошибку.

Спасибо за вашу помощь!

Комментарии:

1. … будет искать совпадение в моей таблице базы данных… какая таблица? Опубликуйте образцы данных.

Ответ №1:

В вашем запросе отсутствует FROM предложение и GROUP BY предложение. Предположительно, у вас есть исходная таблица (скажем src ), и вам нужна одна строка на distinct 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