2010-08-05 18 views

risposta

42

un modo, funziona anche per i valori negativi

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

select PARSENAME(@1,1) 
+1

Quindi cosa succede se il valore è .042 restituisce solo 42 allora? – user380432

+0

no, restituisce 042, entrambi restituiscono 042 -> SELECT PARSENAME (0.042,1), PARSENAME (.042,1) – SQLMenace

+0

Se si desidera solo 42, quindi selezionare cast (PARSENAME (@ 1,1) come int) –

12

È possibile utilizzare FLOOR:

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

uscita:

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

Oppure si può utilizzare 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 
+1

Ora provalo per i numeri negativi: 'SELECT -0.25 - FLOOR (-0.25)' fornisce 0,75. –

+2

Aggiunto [ABS] (http://msdn.microsoft.com/en-us/library/ms189800%28SQL.90%29.aspx) per gestire numeri negativi ... –

+0

Mi piace convertire in un varchar e utilizzare l'indice di su substr, funziona per qualsiasi posizione decimale. –

4

Il solito trucco (che varia un po 'di sintassi) è

x - floor(x) 

Questa è la parte frazionaria. Per trasformarlo in un numero intero, ridimensionarlo.

(x - floor(x)) * 1000 
0

Se si sa che si desidera che i valori ai millesimi, posto, è

SELECT (num - FLOOR(num)) * 1000 FROM table...; 
105

provare questo:

SELECT (num % 1) 
+3

+1 funziona anche in PostgreSQL – Conan

+8

Sembra funzionare solo se num se è DECIMAL. Fallisce per me quando num è un FLOAT. – dsz

+0

In casi come SELECT (100,0001% 1) il risultato mostrato contiene '0'. parte, che è 0.0001. Ma secondo la parte richiesta domanda è '0001' –

0

rendere molto semplice da query:

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

Inserisci il tuo numero o il nome della colonna invece 123.122

-1

È possibile utilizzare DESTRA:

select RIGHT(123.45,2) return => 45 
+1

Questo post viene contrassegnato automaticamente come di bassa qualità perché è così breve. Ti dispiacerebbe espanderlo aggiungendo del testo per spiegare come questo risolve il problema? – gung

+0

Il secondo parametro dipende dal numero di decimali del tipo di dati. – jumxozizi

2

approccio più generalizzato può essere di fondere ParseName e% dell'operatore.(Come ha risposto in due delle risposte di cui sopra)

risultati come al primo approccio di cui sopra da SQLMenace

select PARSENAME(0.001,1) 

Risultato: 001

select PARSENAME(0.0010,1) 

Risultato: 0010

select PARSENAME(-0.001,1) 

Risultato : 001

select PARSENAME(-1,1) 

risultati: -1 -> non deve restituire parte intera

select PARSENAME(0,1) 

risultati: 0

select PARSENAME(1,1) 

risultati: 1 -> non deve restituire parte intera

select PARSENAME(100.00,1) 

Risultato: 00

Risultati come per primo approccio sopra di Pavel Morshenyuk "0". è parte del risultato in questo caso.

SELECT (100.0001 % 1) 

Risultato: 0,0001

SELECT (100.0010 % 1) 

Risultato: 0,0010

SELECT (0.0001 % 1) 

Risultato: 0.0001

SELECT (0001 % 1) 

Risultato: 0

SELECT (1 % 1) 

Risultato: 0

SELECT (100 % 1) 

Risultato: 0

Combinando entrambi:

SELECT PARSENAME((100.0001 % 1),1) 

Risultato: 0001

SELECT PARSENAME((100.0010 % 1),1) 

Risultato: 0010

SELECT PARSENAME((0.0001 % 1),1) 

Risultato: 0001

SELECT PARSENAME((0001 % 1),1) 

Risultato: 0

SELECT PARSENAME((1 % 1),1) 

Risultato: 0

01.235.
SELECT PARSENAME((100 % 1),1) 

Risultato: 0

Ma ancora una questione che resta è lo zero dopo che i numeri da zero non sono parte del risultato (Esempio: 0,0010 -> 0010). Potrebbe essere necessario applicare qualche altra logica per rimuoverlo.

-1

CAST ('' DESTRA (MyField, LEN (MyField) -CHARINDEX (, MyField) +1) come float)

0

Se si desidera selezionare solo i numeri decimali utilizzare questa clausola WHERE:

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

Se si desidera un elenco chiaro è possibile ordinare per decimali/intero:

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