2 votes

Comment forcer l'alias de la colonne à être d'un type de données spécifique ?

J'ai un alias dans la sélection comme ceci :

SELECT
    CASE ....
    WHEN 1 THEN somefield * -10
    WHEN 0 THEN somefield * 10
    END as myAlias
FROM
    ....

le problème est qu'au premier enregistrement que mysql recherche, il marque le "myAlias" comme UNSIGNED mais dans un enregistrement suivant, le même alias produit un entier SIGNÉ, alors j'ai l'erreur :

BIGINT UNSIGNED value is out of range in....

Alors, comment dire à mysql avant qu'il ne fasse une opération que "myAlias" est un SIGNED INTEGER ?

Merci !

éditer :

J'ai essayé

SELECT
    CAST(CASE ....
    WHEN 1 THEN somefield * -10
    WHEN 0 THEN somefield * 10
    END AS SIGNED) as myAlias
FROM
    ....

sans succès !

4voto

Je suppose que le champ de votre table est déclaré comme étant UNSIGNED INTEGER . Dans ce cas, vous devez saisir le champ dans le champ THEN clause de la CASE l'expression. L'exemple ci-dessous illustre un exemple.

Créer et insérer script :

CREATE TABLE mytable
(
     numberfield INTEGER UNSIGNED
   , bitfield BIT
);

INSERT INTO mytable (numberfield, bitfield) VALUES
  (134, 1),
  (673, 0),
  (855, 1),
  (133, 0),
  (778, 1),
  (234, 0);

Tapez le casting du champ dans la clause THEN : Démonstration de SQL Fiddle

SELECT
    CASE bitfield
        WHEN 1 THEN CAST(numberfield AS SIGNED) * -10
        WHEN 0 THEN CAST(numberfield AS SIGNED) * 10
    END as myAlias
FROM mytable

Sortie :

MYALIAS
-------
-1340
6730
-8550
1330
-7780
2340

Autre façon d'écrire la requête ci-dessus : Démonstration de SQL Fiddle

SELECT
    CAST(numberfield AS SIGNED) * 
    (
        CASE bitfield
            WHEN 1 THEN -10
            WHEN 0 THEN 10
        END
    ) as myAlias
FROM mytable

Sortie :

MYALIAS
-------
-1340
6730
-8550
1330
-7780
2340

Sans casting de type le champ : Démonstration de SQL Fiddle

SELECT
    CASE bitfield
      WHEN 1 THEN numberfield * -10
      WHEN 0 THEN numberfield * 10
    END as myAlias
FROM mytable

Erreur :

Troncature des données : La valeur BIGINT UNSIGNED est hors de portée dans '( db_5b3bb . mytable . numberfield * -(10))' : SELECT CASE bitfield WHEN 1 THEN numberfield * -10 WHEN 0 THEN numberfield * 10 END as myAlias FROM mytable

0voto

paulsm4 Points 39422

Essayez d'utiliser la fonction "cast()" :

http://dev.mysql.com/doc/refman/5.1/en/cast-functions.html#function_cast

EX : select * from mytable where myfield=cast(somefield as UNSIGNED INTEGER)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X