2016-05-03 29 views
1

ich aus einem Datensatz führenden und nachgestellten Nullen entfernen müssen:SQL Server - entfernen führende und nachgestellte Nullen

WITH 

data as (
    select 0.10 ITEM 
    union all 
    select -1.00 
    union all 
    select 0.20 
    union all 
    select 2.00 
    union all 
    select 508000015.00 
) 

so dass das Ergebnis aussehen:

ITEM 
.1 
-1 
.2 
2 
508000015 

Gibt es eine bündigen oder mehr effiziente Art und Weise so

SELECT case 
      # if item isn't an integer, trim 0 from left and right 
      when item % 1 = item then REPLACE(RTRIM(LTRIM(REPLACE(item,'0',' '))),' ','0') 
      else cast(cast(item as int) as varchar) 
     end VALUE 
FROM data 
+2

Was ist der Datentyp der Elemente? –

+0

'NUMERIC (12,2)' – craig

+0

Gibt es einen knappen Grund dafür, dass keine abschließenden Nullen benötigt werden? Sind signifikante Ziffern oder Formatierungen nicht wichtiger? Speichern bei numerisch, Integer, sogar Float scheint hier sinnvoll zu sein, es sei denn, Sie beabsichtigen, es als Text zu behalten. – BrownRedHawk

Antwort

0

versuchen, etwas zu tun wie .....

WITH data as (
    select 0.10 ITEM 
    union all 
    select -1.00 
    union all 
    select 0.20 
    union all 
    select 2.00 
    union all 
    select 508000015.00 
) 
Select CASE WHEN RIGHT(REPLACE(RTRIM(LTRIM(REPLACE(ITEM,'0',' '))),' ','0'), 1) = '.' 
      THEN REPLACE(REPLACE(RTRIM(LTRIM(REPLACE(ITEM,'0',' '))),' ','0'),'.','') 
      ELSE REPLACE(RTRIM(LTRIM(REPLACE(ITEM,'0',' '))),' ','0') END 
from data 
1

So etwas wie dies auch gut funktionieren könnte:

WITH 
data as (
    select 0.10 ITEM 
    union all 
    select -1.00 
    union all 
    select 0.20 
    union all 
    select 2.00 
    union all 
    select 508000015.00 
) 
SELECT * 
FROM data as d 
CROSS 
APPLY (SELECT 
       SUBSTRING(CAST(ITEM AS varchar(32)), PATINDEX('0%', CAST(ITEM AS VARCHAR(32))) + 1, LEN(ITEM))) AS f (lead0) -- remove leading 0 
CROSS 
APPLY (SELECT 
       SUBSTRING(f.lead0, 1, CASE 
             WHEN RIGHT(f.lead0, 2) = '00' THEN LEN(f.lead0) - 3 -- remove decimal point as well 
             WHEN RIGHT(f.lead0, 1) = '0' THEN LEN(f.lead0) - 1 
             ELSE LEN(f.lead0) 
            END)) AS s (end0); 
0

Wenn Sie die Daten in einem numeric sind Speicher (12, 2) Spalte es keine Rolle spielt. SQL Server wird den Inhalt immer mit 2 Dezimalstellen darstellen.

SELECT 
    CAST(1.0 AS NUMERIC(12, 2))  AS [NoDp], 
    CAST(1.0 AS NUMERIC(12, 2))  AS [1Dp], 
    CAST(1.00 AS NUMERIC(12, 2)) AS [2Dp], 
    CAST(1.000 AS NUMERIC(12, 2)) AS [3Dp] 
; 

Returns

NoDp 1Dp  2Dp  3Dp 
1.00 1.00 1.00 1.00 

Wenn Sie die Ausgabe in der Formatierung dieser interessiert sind am besten in der Präsentationsschicht erfolgt.

0

Ich denke, das kann einfacher sein. Entschuldigung dafür, ein bisschen faul zu sein, aber ich denke, du wirst die Idee bekommen.

WITH data as (
select 0.10 ITEM 
union all 
select -1.00 
union all 
select 0.20 
union all 
Select 2.00 
union all 
select 508000015.00 
union all 
select 508015 
union all 
select 50815) 

set1 as (Select 
case when LEN(item) > 6 then cast(cast(item as numeric) as varchar) 
else cast(cast(item as float) as varchar) 
end item 
from data) 

select 
case 
    when item like '0.%' then RIGHT(item,len(item)-1) else item 
end As item 
from set1 
Verwandte Themen