web-dev-qa-db-fra.com

Sélectionnez des nombres avec plus de 4 décimales

J'ai une table SQL avec une colonne float remplie de valeurs comme celles-ci:

  1.4313
  3.35
  2.55467
  6.22456
  3.325

Je dois sélectionner des lignes contenant uniquement des valeurs avec plus de 4 décimales. Dans ce cas, la sélection doit renvoyer:

2.55467
6.22456

Des idées? Merci!

C'est ce que j'ai essayé jusqu'à présent

select * 
from table 
where CAST(LATITUDE AS DECIMAL(10,5)) - LATITUDE = 0
7
BernieSF
DECLARE @tbl TABLE (val float)
INSERT INTO @tbl SELECT 1234.567
INSERT INTO @tbl SELECT 1234.5678
INSERT INTO @tbl SELECT -1234.5678
INSERT INTO @tbl SELECT 1234.56789

SELECT *
from @tbl
where (((abs(val)*10000) - CONVERT(INT,(abs(val)*10000))) <> 0)
14
UnhandledExcepSean

Pourquoi ne pouvons-nous pas simplifier les choses avec cette requête: -

SELECT * FROM table WHERE val LIKE '%.____%'

Cela sélectionne ce que nous voulons

6
Alif Noushad
SELECT *
FROM table WHERE
(abs(val)*100000)%10 <> 0
2
agondaku

http://sqlfiddle.com/#!3/abadc/3/0

On dirait que quelque chose comme ça devrait marcher ...

tout ce qu'il fait est de convertir le nombre en un entier pour qu'il supprime les décimales après l'avoir multiplié * 10 par la puissance décimale dont vous avez besoin, puis il compare cette version int du nombre au nombre de base après qu'il a également été multiplié par 10, à la puissance de de décimales.

Si les nombres ne correspondent pas, vous avez un nombre de décimales supérieur à 4. S'ils correspondent, le nombre était de 4 ou moins.

Select *
      from foo
      where cast(myNum*power(10,4) as int) <> myNum*power(10,4)
2
xQbert

S'il vous plaît essayer quelque chose comme: 

select * from table
where RIGHT(CAST(value as DECIMAL(10,5)), value), 1) != 0
2
Roman Marusyk

Les réponses données ne fonctionnaient pas pour moi avec MaxDb, mais cela ne fonctionnait pas:

where FLOOR(value * 10000) != value * 10000

La source

Réduire/Augmenter les 0 pour moins/plus de précision.

1
torno

C'est une question plus ancienne mais elle vérifie.

select val
from table
where ((val * 100) % 1) > 0

Changez 100 à votre précision.

0
AdemusPrime

Vous pouvez le multiplier par 10000 et le soustraire du nombre initial en remplaçant . par ''.

Fiddle

select * from tablename
where replace(numcolumn,'.','') - numcolumn * 10000 > 0
0
Vamsi Prabhala

Vous trouverez ci-dessous le code qui vérifiera la précision pour 4 décimales:

  1. Remplacez MyNum par la colonne que vous vérifiez pour la précision
  2. Remplacez MyTbl par le tableau que vous utilisez
  3. Remplacez 4 par la précision recherchée

Sql:

SELECT  MyNum
      , LEN(CAST (MyNum AS CHAR))
      , -------1. length of decimal number, after conversion to CHAR
        CHARINDEX('.', CAST (MyNum AS CHAR))
      , ---2.length of numbers after the '.'
        LEN(CAST (MyNum AS CHAR)) - CHARINDEX('.', CAST (MyNum AS CHAR))  -----subtracting 1-2, to get the length of numbers after decimal point '.'
FROM    MyTbl
WHERE   LEN(CAST(MyNum AS CHAR)) - CHARINDEX('.', CAST(MyNum AS CHAR)) > 4; --checking if there are more than 4 numbers after the decimal point '.'
0

Une autre solution également:

SELECT * from table
where (round(value,2) - round(value,4) <> 0)
0
Lukas