#python #mysql #database #null
Вопрос:
У меня есть таблица в mysql с 80 столбцами. Большинство из этих столбцов не имеют значения null. В общем случае каждая строка возвращает около 8 или 9 столбцов, которые не являются нулевыми (данные были вставлены). Я считаю, что в инструкции mysql нет способа вернуть из извлеченной строки только те столбцы, которые не являются нулевыми. Мой вопрос в том, что, поскольку я новичок в Python, каков наилучший подход в этом сценарии для достижения моей цели ? Объяснил это лучше, как показано ниже:
- Запрос mysql извлек строку
- Строка содержит 8 не пустых столбцов
- Строка содержит 72 пустых столбца
- если первый столбец не равен нулю, то отобразите имя столбца и данные столбца
- если второй столбец не равен нулю, то отобразите имя столбца и данные столбца 6, если третий столбец не равен …….. и так далее до последнего столбца
Спасибо за любую помощь в этом.
Комментарии:
1. Какую библиотеку mysql Python вы используете? Если вы извлекаете строку в виде простого массива, вы можете просмотреть их и распечатать только те, у которых есть значение. Все библиотеки также имеют возможность извлекать список имен столбцов в виде массива.
2. mysql может фильтровать нулевое значение, используйте «где значение не равно нулю», надеюсь, это немного поможет.
Ответ №1:
Выходной список должен быть определенным, т. е. количество столбцов в нем не может быть динамическим. Вы можете решить, например, что выходные данные будут содержать 10 столбцов, и создать соответствующий запрос.
Шаблон:
SELECT id,
CASE WHEN cnt > 0
THEN SUBSTRING_INDEX(SUBSTRING_INDEX(total, CHAR(0), 1), CHAR(0), -1)
END field1,
CASE WHEN cnt > 1
THEN SUBSTRING_INDEX(SUBSTRING_INDEX(total, CHAR(0), 2), CHAR(0), -1)
END field2,
..
CASE WHEN cnt > 9
THEN SUBSTRING_INDEX(SUBSTRING_INDEX(total, CHAR(0), 10), CHAR(0), -1)
END field10,
cnt
FROM ( SELECT id,
CONCAT_WS(CHAR(0), field1, field2, .. , field80) total,
field1 IS NOT NULL field2 IS NOT NULL .. field80 IS NOT NULL cnt
FROM source_table ) AS compacted
Идея проста — CONCAT_WS пропускает нулевые значения. Символ(0) используется в качестве разделителя, потому что это самый редкий символ в значении любого недвоичного типа данных.
Если количество НЕНУЛЕВЫХ значений меньше 10, то остальные выходные значения будут равны НУЛЮ.
Если количество НЕНУЛЕВЫХ значений превышает 10, то остальные значения отображаться не будут. Это можно определить по cnt
значению столбца вместо 80-битных столбцов.
Но ваши значения являются 0
или 1
только так, чтобы вы могли упростить запрос до
SELECT id,
SUBSTRING(total FROM 1 FOR 1) field1,
SUBSTRING(total FROM 2 FOR 1) field2,
...
SUBSTRING(total FROM 10 FOR 1) field10,
cnt
FROM ( SELECT id,
CONCAT_WS('', field1, field2, .. , field80) total,
field1 IS NOT NULL field2 IS NOT NULL .. field80 IS NOT NULL cnt
FROM source_table ) AS compacted
Разница в том, что этот запрос вернет пустую строку, а не нулевое значение, для избыточных столбцов. Если вам нужны значения NULL, примените функцию NULLIF ().
Но я настоятельно рекомендую вам нормализовать свои данные. Либо используйте шаблон EAV, либо, по крайней мере, 2 столбца ЗАДАННОГО типа данных.