2010-03-30 5 views
0

Création d'attributs de produit personnalisables dans un magasin Web: chaque attribut peut avoir un type de données différent, chaque type de données étant stocké dans une colonne distincte utilisant le type de données mysql correspondant.Mysql CASE - WHEN - THEN - renvoi du type de données incorrect (BLOB)

J'ai une question comme:

SELECT 
products.id AS id, 
products.sku AS sku, 
products.name AS name, 
products.url_key AS url_key, 
attributes.name AS attribute, 

CASE 
    WHEN `attribute_types`.`type` = 'text' 
     THEN product_attribute_values.value_text 
    WHEN `attribute_types`.`type` = 'float' 
     THEN product_attribute_values.value_float 
    WHEN `attribute_types`.`type` = 'price' 
     THEN product_attribute_values.value_float 
    WHEN `attribute_types`.`type` = 'integer' 
     THEN product_attribute_values.value_integer 
    WHEN `attribute_types`.`type` = 'multiple' 
     THEN product_attribute_values.value_text 
    WHEN `attribute_types`.`type` = 'dropdown' 
     THEN product_attribute_values.value_text 
    WHEN `attribute_types`.`type` = 'date' 
     THEN product_attribute_values.value_date 
    WHEN `attribute_types`.`type` = 'textarea' 
     THEN product_attribute_values.value_textarea 
END as value 

from (...) 

Maintenant, le problème est que lorsque attribute_types. type est égal à? Some-type? Je veux qu'il renvoie une valeur car il est stocké dans product_attribute_values table. Actuellement, je reçois BLOb à chaque fois. Dois-je utiliser le cast de type ou y a-t-il de la magie derrière la scène que je ne connais pas, OU peut-être y a-t-il une meilleure alternative?

EDIT:

Tout semble bien se passer (prix vérifier im qui est flottant) jusqu'à ce que j'ajouter une condition pour TEXT (textarea).

+0

Une instruction CASE renvoie toujours le même type de données: http://dev.mysql.com/doc/refman/5.1/en/control-flow-functions.html –

+0

oui merci pour l'avoir signalé. "Le type de retour par défaut d'une expression CASE est le type agrégé compatible de toutes les valeurs de retour, mais dépend également du contexte dans lequel il est utilisé." –

Répondre

0

Il semble que vous utilisiez un navigateur de requête. Essayez d'exécuter cette commande via "Putty".

De même, pour obtenir la sortie correcte même dans le navigateur de requêtes, incluez la fonction CAST dans votre instruction CASE comme ceci.

CAST(
CASE 
WHEN `attribute_types`.`type` = 'text' 
    THEN product_attribute_values.value_text 
WHEN `attribute_types`.`type` = 'float' 
    THEN product_attribute_values.value_float 
WHEN `attribute_types`.`type` = 'price' 
    THEN product_attribute_values.value_float 
WHEN `attribute_types`.`type` = 'integer' 
    THEN product_attribute_values.value_integer 
WHEN `attribute_types`.`type` = 'multiple' 
    THEN product_attribute_values.value_text 
WHEN `attribute_types`.`type` = 'dropdown' 
    THEN product_attribute_values.value_text 
WHEN `attribute_types`.`type` = 'date' 
    THEN product_attribute_values.value_date 
WHEN `attribute_types`.`type` = 'textarea' 
    THEN product_attribute_values.value_textarea 
END 
AS CHAR) as value 
Questions connexes