Les littéraux de chaîne dans Firebird sont de type CHAR
, le type de données d'une expression de cas aura la plus grande longueur de toutes les branches. Donc, avec
CASE BILANCA WHEN 0 THEN 'SMALLINT' WHEN 1 THEN 'NUME' END
Le type de données sera CHAR(8)
. Une valeur CHAR
sera toujours correctement remplie avec les espaces à la longueur déclarée.
Toutefois, lorsque l'une des branches d'une expression de cas est VARCHAR
, toutes les branches sont forcées à VARCHAR
. Et concaténation Firebird produira toujours un VARCHAR
, même si les deux opérandes sont CHAR
Cela signifie que dans le cas de BILANCA1
:
CASE BILANCA
WHEN 1 THEN
CASE BILANCA WHEN 0 THEN 'SMALLINT' WHEN 1 THEN 'NUME' END
ELSE 'A'||'B' END
que 'A'||'B'
est un VARCHAR(2)
, ce qui provoque toute l'affaire à sous la contrainte à VARCHAR
, ce qui provoque alors 'SMALLINT'
pour devenir un VARCHAR(8)
et 'NUME'
un VARCHAR(4)
, ce qui rend l'expression entière devient VARCHAR(8)
.
Notez que ce type de coercition est poussé vers le bas, de sorte que le littéral sera varchar
dès le début et ne sera pas masqué * par une évaluation intermédiaire de l'instruction case la plus interne.
Ce n'est pas le cas pour BILANCA2
, étant donné que toutes les branches (imbriquées) sont des littéraux, ce sera CHAR(8)
.
Si vous voulez à la fois pour le même comportement que vous pouvez faire:
- Cast l'expression entière du type souhaité (cela fonctionnerait aussi bien pour
bilanca1
et bilanca2
)
- partie Cast de l'expression (par exemple un des littéraux ou le cas imbriqué) à
varchar
; cela fonctionne uniquement pour forcer bilanca2
à varchar
- Transmettez la concaténation de chaîne à
char
; cela fonctionne uniquement pour forcer bilanca1
à char
- Concaténer une chaîne vide à l'un des littéraux; cela ne fonctionne que pour forcer
bilanca2
à un varchar
- Utilisation
trim
sur l'expression entière (cela aussi contraint à varchar
)
*) Ceci contraste avec par exemple cast(cast('nume' as char(8)) as varchar(8))
qui produira 'nume '
et non pas seulement 'nume'
comme dans ce cas le résultat intermédiaire est préservé, et les espaces existants ne sont pas jetés dans un varchar
.