2017-10-10 27 views
1

Je tente d'exécuter un simple script UPDATE sur un champ integer, les deux derniers chiffres étant "conservés" et les premiers chiffres étant supprimés. Par exemple, "0440" serait mis à jour en tant que "40". Je peux obtenir les données souhaitées dans un communiqué SELECT, commeFonction RIGHT dans l'instruction UPDATE avec champ entier

SELECT RIGHT(field_name::varchar, 2) 
FROM table_name; 

Cependant, je rencontre une erreur lorsque je tente d'utiliser cette même fonctionnalité dans un script UPDATE, tels que:

UPDATE schema_name.table_name 
SET field_name = RIGHT(field_name::varchar, 2); 

L'erreur que je reçois est la suivante:

colonne. . . est de type entier mais l'expression est de type texte. . . TRUC: Vous aurez besoin de réécrire ou de jeter l'expression

+0

Pour plus de précisions, est 'field_name '' une colonne '' int '' ou 'varchar' dans votre table? –

+0

@ChrisJ: Titre et erreur msg dit' integer'. (Bien que le texte de la question soit un peu trompeur.) –

+1

La question semble trop évidente, donc je pensais que c'était mérite d'être clarifié –

Répondre

0

Vous castez l'entier à varchar mais vous n'êtes pas coulée le résultat à entier.

UPDATE schema_name.table_name 
SET field_name = RIGHT(field_name::TEXT, 2)::INTEGER; 
0

L'erreur est tout droit vers l'avant - right déclarations de données textuelles, que vous ne pouvez pas attribuer à une colonne entière. Vous pouvez, cependant, CAST explicitement retour:

UPDATE schema_name.table_name 
SET field_name = RIGHT(field_name::varchar, 2)::int; 
0

1 est un chiffre (ou un numéro - ou une chaîne), '123' est un nombre (ou une chaîne).

Votre exemple 0440 n'a pas de sens pour une valeur integer, car les premiers (insignifiants) 0 ne sont pas stockés.

strictement parlant le type integer est pas bon de données pour stocker les « fuite 2 chiffres » - ce qui signifie chiffres - depuis 00 et 0 résultat à la fois de la même valeur entière 0. Mais je ne pense pas que ce soit ce que tu voulais dire.

Pour le fonctionnement de la valeur numérique, ne pas utiliser les fonctions de chaîne (qui exige coulée et-vient Le modulo operator % fait ce que vous avez besoin, exactement.. field_name%100 donc:

UPDATE schema_name.table_name 
SET field_name = field_name%100 
WHERE field_name > 99; -- to avoid empty updates