2010-11-10 6 views
2

Cette fonction:zéro SQL au lieu de null

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

soulève:

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

Comment puis-je faire mes zéros de retour de la requête au lieu de nulls afin que je puisse résoudre ce problème? (Je modélisant les données, donc je ne peux pas ajouter «n'est pas nul » à mon instruction select.

+0

@relima: Quelle interface DB utilisez-vous qui retourne une chaîne Python '" NULL "' à la place de Python 'None'? –

+2

@Glenn Maynard Downvoted votre commentaire comme «bruit». Voté question pour le commentaire de snarky downvote. – Keng

+2

Glenn Maynard: 349 Votes. 282 voix en bas. 0 questions – relima

Répondre

6

Vous pouvez résoudre ce problème avant qu'il arrive à Python avec une déclaration de cas dans votre requête:

CASE WHEN FIELD_NAME IS NULL THEN 0 ELSE FIELD_NAME END, 

commencent modifier

D'autres variantes de SQL font différemment (pris d'autres réponses):

COALESCE(FIELD_NAME, 0) 

ou

IFNULL(FIELD_NAME, 0) 

fin modifier

Ou le manipuler dans votre liste comp comme si (en supposant NULL est un objet prédéfini ou constant):

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

Ou créer une fonction de conversion client:

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

Mettez IFNULL(fieldname, 0) AS fieldname dans la liste des champs de la requête.

+0

Cette fonction n'est pas standard et n'est pas nécessaire. utilisez 'coalesce'. –

+2

@Glen Maynard: La conformité avec ANSI SQL est surestimée et difficile à réaliser. Et il y aura une autre fonctionnalité spécifique SQLLite-dialect quelque part. Si cette migration vers, par exemple, SQL Server, COALESCE est une responsabilité. – gbn

+3

@gbn: Et si 'IFNULL' est migré vers Postgresql, * c'est une responsabilité.À moins que l'utilisateur n'envisage réellement de migrer vers SQL Server, il devrait être encouragé à choisir la fonction standard par défaut. –

2

Vous utiliseriez IFNULL

...IFNULL(MyField, 0) AS MyField... 
2

L'erreur n'a pas de sens, Python ne pas « NULL », il a « Aucun »

La propre chose à faire est d'utiliser soudent SQL: SELECT COALESCE(value, 0) pour convertir NULL SQL à 0.

. 210

Si vous obtenez None et que vous savez que les valeurs sont des entiers, vous pouvez indiquer int(x[0] or 0) en toute sécurité.

Questions connexes