web-dev-qa-db-fra.com

SQL - Comment obtenir uniquement les nombres après la virgule?

Comment puis-je obtenir uniquement les nombres après la décimale?

Exemple: 2.938 = 938

41
user380432

une manière, fonctionne aussi pour les valeurs négatives

declare @1 decimal(4,3)
select @1 = 2.938

select PARSENAME(@1,1)
50
SQLMenace

essaye ça:

SELECT (num % 1)
115
Pavel Morshenyuk

Vous pouvez utiliser FLOOR:

select x, ABS(x) - FLOOR(ABS(x))
from (
    select 2.938 as x
) a

Sortie:

x                                       
-------- ----------
2.938    0.938

Ou vous pouvez utiliser SUBSTRING:

select x, SUBSTRING(cast(x as varchar(max)), charindex(cast(x as varchar(max)), '.') + 3, len(cast(x as varchar(max))))
from (
    select 2.938 as x
) a
13
RedFilter

Une approche plus généralisée pourrait consister à fusionner PARSENAME et% operator. (comme répondu dans deux des réponses ci-dessus)

Résultats selon la 1ère approche ci-dessus par SQLMenace

select PARSENAME(0.001,1) 

Résultat: 001

select PARSENAME(0.0010,1) 

Résultat: 0010

select PARSENAME(-0.001,1)

Résultat: 001

select PARSENAME(-1,1)

Résultat: -1 -> Ne doit pas renvoyer de partie entière

select PARSENAME(0,1)

Résultat: 0 

select PARSENAME(1,1)

Résultat: 1 -> Ne doit pas renvoyer de partie entière

select PARSENAME(100.00,1)

Résultat: 00

Résultats selon la 1ère approche ci-dessus par Pavel Morshenyuk "0." fait partie du résultat dans ce cas.

SELECT (100.0001 % 1)

Résultat: 0.0001

SELECT (100.0010 % 1)

Résultat: 0.0010

SELECT (0.0001 % 1)

Résultat: 0.0001

SELECT (0001 % 1)

Résultat: 0

SELECT (1 % 1)

Résultat: 0

SELECT (100 % 1)

Résultat: 0

Combinant les deux: 

SELECT PARSENAME((100.0001 % 1),1)

Résultat: 0001

SELECT PARSENAME((100.0010 % 1),1)

Résultat: 0010

SELECT PARSENAME((0.0001 % 1),1)

Résultat: 0001

SELECT PARSENAME((0001 % 1),1)

Résultat: 0

SELECT PARSENAME((1 % 1),1)

Résultat: 0

SELECT PARSENAME((100 % 1),1)

Résultat: 0

Mais il reste encore un problème: le zéro après que les nombres non nuls fassent partie du résultat (exemple: 0.0010 -> 0010). Peut-être faut-il appliquer une autre logique pour supprimer cela.

6
Tejasvi Hegde

Le hack habituel (qui varie un peu dans la syntaxe) est 

x - floor(x)

C'est la partie décimale. Pour en faire un entier, mettez-le à l'échelle.

(x - floor(x)) * 1000
4
S.Lott

Rendez-le très simple par requête:

select substr('123.123',instr('123.123','.')+1, length('123.123')) from dual;

Mettez votre numéro ou nom de colonne à la place 123.122

1
user2412524

Si vous savez que vous voulez les valeurs au millième, placez, c'est

SELECT (num - FLOOR(num)) * 1000 FROM table...;
0
Seamus Campbell

Si vous souhaitez sélectionner uniquement des nombres décimaux, utilisez cette clause WHERE:

    (CAST(RIGHT(Myfield, LEN( Myfield)-CHARINDEX('.',Myfield)+1 ) AS FLOAT)) <> 0

Si vous voulez une liste claire, vous pouvez trier par décimal/entier:

    CASE WHEN 0 = CAST(RIGHT(Myfield, LEN( Myfield)-CHARINDEX('.',Myfield)+1 ) AS FLOAT) THEN 'Integer' ELSE 'Decimal' END AS Type
0
Jonas Fermefors