SQL ноль вместо нуля - PullRequest
       40

SQL ноль вместо нуля

2 голосов
/ 10 ноября 2010

Эта функция:

for i in Selection: 
    cursor.execute(Query)
    ydata[i] = [int(x[0]) for x in cursor.fetchall()]

повышает:

ValueError: invalid literal for int(): NULL if a null value is found.

Как я могу заставить мой запрос возвращать нули вместо нулей, чтобы я мог это исправить? (Я строю данные, поэтому я не могу добавить «не является нулевым» в мой оператор выбора.

Ответы [ 4 ]

6 голосов
/ 10 ноября 2010

Вы можете исправить это до того, как он попадет в Python с помощью оператора case в вашем запросе:

CASE WHEN FIELD_NAME IS NULL THEN 0 ELSE FIELD_NAME END,

начать редактирование

Другие варианты SQL делают это по-другому (взято из других ответов):

COALESCE(FIELD_NAME, 0)

или

IFNULL(FIELD_NAME, 0)

конец редактирования

Или обработайте это в вашем списке comp следующим образом (предполагается, что NULL является предопределенным объектом или константой):

ydata[i] = [(int(x[0]) if x[0] != NULL else 0) for x in cursor.fetchall()]

Или создайте функцию преобразования клиента:

def field_to_int(val):
    if val == NULL:
        return 0
    else:
        return int(val)

for i in Selection: 
    cursor.execute(Query)
    ydata[i] = [field_to_int(x[0]) for x in cursor.fetchall()]
2 голосов
/ 10 ноября 2010

Вы бы использовали IFNULL

...IFNULL(MyField, 0) AS MyField...
2 голосов
/ 10 ноября 2010

Ошибка не имеет смысла;Python не имеет "NULL", он имеет "None".

Самое чистое, что нужно сделать, это использовать SQL coalesce: SELECT COALESCE(value, 0) для преобразования SQL NULL в 0.

Если вы 'Если вы получаете None, и вы знаете, что значения являются целыми числами, тогда вы можете смело сказать int(x[0] or 0).

2 голосов
/ 10 ноября 2010

Поместите IFNULL(fieldname, 0) AS fieldname в список полей запроса.

...