Signe d'une valeur sur position fixe en sortie de requête

Signe d'une valeur sur position fixe en sortie de requête - SQL/NoSQL - Programmation

Marsh Posté le 08-06-2005 à 16:36:26    

L'objectif est d'obtenir quelquesoit le signe (+/-) une valeur en sortie sur position fixe comprenant le signe devant :
Ex:
right('-'+'00'+champ,4)  
ok si la valeur n'est pas signée et que je force pour y mettre un - devant ca donne :  
-001  
 
right('-'+'00'+champ,4)  
Par contre si la valeur est signée j'obtiens ce résultat au lieu de -001 :  
+001  
00-1  
 

Reply

Marsh Posté le 08-06-2005 à 16:36:26   

Reply

Marsh Posté le 08-06-2005 à 16:48:14    

Bon, la question est : quel SGBD utilises-tu ?
 
Avec SQL Server, tu aurais un truc de ce genre :
 

Code :
  1. select case sign(val)
  2.   when -1 then '-' + right('0000' + cast(val as varchar), 4)
  3.   when 0 then ' ' + right('0000' + cast(val as varchar), 4)
  4.   when 1 then '+' + right('0000' + cast(abs(val) as varchar), 4)
  5.   end


 
Mais ça sera très différent avec d'autres SGBD, ça reste donc la question importante.

Reply

Marsh Posté le 08-06-2005 à 16:52:20    

La difficulté vient du fait que dans ma requête j'ai déjà l'utisation du CASE
 
VAL= CASE CHAMP  
 WHEN '7' then right('-'+'00'+cast(CHAMP as varchar),4)
 WHEN '8' then right('-'+'00'+cast(CHAMP as varchar),4)
END
 
dans ce cas comment y mettre ta solution (avec un second case) ?
   

Citation :

select case sign(val)
         when -1 then '-' + right('0000' + cast(val as varchar), 4)  
         when 0 then ' ' + right('0000' + cast(val as varchar), 4)  
         when 1 then '+' + right('0000' + cast(abs(val) as varchar), 4)  
         end


Message édité par systemanager le 08-06-2005 à 16:53:21
Reply

Marsh Posté le 08-06-2005 à 17:12:43    

ha, ben met juste abs() autour de ton val, comme dans mon cas où j'avais du négatif :)

Reply

Marsh Posté le 08-06-2005 à 17:19:35    

si je mets ABS je n'obtiens que des valeurs absolues.  
J'ai besoin du signe + ou - suivi de 2 zéro puis la valeur exact :
+001 ou -002 par exemple.

Reply

Marsh Posté le 08-06-2005 à 18:54:48    

Comprend rien à ton problème...
 
On va faire simple :
 
Tu as une variable "@flag" qui contient 7 ou 8. Si 7, alors "-" devant le nombre @val. Si 8 alors "+" devant le nombre @val.
 
Le nombre @val doit sortir sous la forme "s000", c'est à dire 3 chiffres, 0 leading 0 compris, et le signe devant.
 
Hypothèse 1
On se moque du signe original de @val, c'est @flag qui prime.
 

Code :
  1. select case @flag
  2.        when 7 then '-' + right('000' + cast(abs(@val) as varchar), 3) 
  3.        when 8 then '+' + right('000' + cast(abs(@val) as varchar), 3) 
  4.        end


 
C'était ce que j'entendais par :

Arjuna a écrit :

ha, ben met juste abs() autour de ton val, comme dans mon cas où j'avais du négatif :)


 
Hypothèse 2
On prend en compte le signe original de @val, c'est à dire que s'il est +, alors on utilise celui précisé par @flag, sinon on utilise l'opposé de @flag.
 

Code :
  1. select case @flag
  2.        when 7 then
  3.        (
  4.            case sign(@val)
  5.            when 1 then "-"
  6.            when 0 then "+" -- si c'est 0, alors c'est forcément le signe +
  7.            when -1 then "+"
  8.            end
  9.        )
  10.        + right('000' + cast(abs(@val) as varchar), 3) 
  11.        when 8 then
  12.        (
  13.            case sign(@val)
  14.            when 1 then "+"
  15.            when 0 then "+"
  16.            when -1 then "-"
  17.            end
  18.        )
  19.        + right('000' + cast(abs(@val) as varchar), 3)
  20.        end


 
Voilà, selon l'hypothèse, ça doit marcher.


Message édité par Arjuna le 08-06-2005 à 18:55:30
Reply

Marsh Posté le 08-06-2005 à 19:01:04    

J'y pense, toujours pour la dernière solution, un truc genre :
 

Code :
  1. select case sign((@flag - 7.5) * @val)
  2.        when 1 then '+' + right('000' + cast(abs(@val) as varchar), 3)
  3.        when 0 then '+' + right('000' + cast(abs(@val) as varchar), 3)
  4.        when -1 then '-' + right('000' + cast(abs(@val) as varchar), 3)


 
Ca doit marcher aussi, et c'est "un peu plus" sexy :)


Message édité par Arjuna le 08-06-2005 à 19:01:14
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed