Ich habe eine Kolumne DECIMAL(9,6)
dh sie unterstützt Werte wie 999.123456.
Aber wenn ich Daten wie 123,4567 einfüge, wird es 123,456700
Wie entferne ich diese Nullen?
Ich habe eine Kolumne DECIMAL(9,6)
dh sie unterstützt Werte wie 999.123456.
Aber wenn ich Daten wie 123,4567 einfüge, wird es 123,456700
Wie entferne ich diese Nullen?
Antworten:
A decimal(9,6)
speichert 6 Ziffern auf der rechten Seite des Kommas. Ob nachgestellte Nullen angezeigt werden sollen oder nicht, ist eine Formatierungsentscheidung, die normalerweise auf der Clientseite implementiert wird.
Aber da SSMS Formate float
ohne nachfolgende Nullen können Sie Nullen Hinter entfernen , indem Sie das Gießen decimal
auf ein float
:
select
cast(123.4567 as DECIMAL(9,6))
, cast(cast(123.4567 as DECIMAL(9,6)) as float)
Drucke:
123.456700 123,4567
(Mein Dezimaltrennzeichen ist ein Komma, aber SSMS formatiert die Dezimalstelle mit einem Punkt. Anscheinend ein bekanntes Problem .)
Sie können die FORMAT()
Funktion verwenden (SqlAzure und Sql Server 2012+):
SELECT FORMAT(CAST(15.12 AS DECIMAL(9,6)), 'g18') -- '15.12'
SELECT FORMAT(CAST(0.0001575 AS DECIMAL(9,6)), 'g10') -- '0.000158'
SELECT FORMAT(CAST(2.0 AS DECIMAL(9,6)), 'g15') -- '2'
Seien Sie vorsichtig bei der Verwendung mit FLOAT (oder REAL): Verwenden Sie nicht g17
oder größer (oder g8
größer mit REAL), da die begrenzte Genauigkeit der Maschinendarstellung unerwünschte Effekte verursacht:
SELECT FORMAT(CAST(15.12 AS FLOAT), 'g17') -- '15.119999999999999'
SELECT FORMAT(CAST(0.9 AS REAL), 'g8') -- '0.89999998'
SELECT FORMAT(CAST(0.9 AS REAL), 'g7') -- '0.9'
Beachten Sie außerdem, dass gemäß der Dokumentation :
FORMAT basiert auf dem Vorhandensein der .NET Framework Common Language Runtime (CLR). Diese Funktion wird nicht entfernt, da sie vom Vorhandensein der CLR abhängt. Das Remoten einer Funktion, für die die CLR erforderlich ist, würde einen Fehler auf dem Remoteserver verursachen.
Funktioniert auch in SqlAzure.
SELECT CONVERT(DOUBLE PRECISION, [ColumnName])
Ich wollte nicht in Float umwandeln, da möglicherweise mehr Ziffern in meiner Dezimalstelle stehen, als Float darstellen kann
FORMAT
Bei Verwendung mit einem Standard-.net-Format gab die Zeichenfolge 'g8' die wissenschaftliche Notation bei sehr kleinen Dezimalstellen (z. B. 1e-08) zurück, was ebenfalls ungeeignet war
Durch die Verwendung einer benutzerdefinierten Formatzeichenfolge ( https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings ) konnte ich das erreichen, was ich wollte:
DECLARE @n DECIMAL(9,6) =1.23;
SELECT @n
--> 1.230000
SELECT FORMAT(@n, '0.######')
--> 1.23
Wenn Sie möchten, dass Ihre Zahl mindestens eine nachgestellte Null hat, damit aus 2.0 nicht 2 wird, verwenden Sie eine Formatzeichenfolge wie 0.0#####
Der Dezimalpunkt ist lokalisiert, sodass Kulturen, die ein Komma als Dezimaltrennzeichen verwenden, auf eine Kommaausgabe stoßen, bei der die. ist
Dies ist natürlich die unangenehme Praxis, die Datenschicht formatieren zu lassen (aber in meinem Fall gibt es keine andere Schicht; der Benutzer führt buchstäblich eine gespeicherte Prozedur aus und schreibt das Ergebnis in eine E-Mail: /)
SELECT REVERSE(ROUND(REVERSE(2.5500),1))
Drucke:
2.55
Cast(20.5500 as Decimal(6,2))
Sollte es tun.
Versuche dies :
SELECT REPLACE(TRIM(REPLACE(20.5500, "0", " ")), " ", "0")
Gibt 20.55
Ich hatte ein ähnliches Problem, musste aber auch den Dezimalpunkt entfernen, wenn keine Dezimalstelle vorhanden war. Hier ist meine Lösung, die die Dezimalstelle in ihre Komponenten aufteilt und die Anzahl der Zeichen, die aus der Dezimalzeichenfolge entnommen werden, auf der Länge von basiert die Fraktionskomponente (ohne Verwendung von CASE). Um die Sache noch interessanter zu machen, wurde meine Nummer als Float ohne Dezimalstellen gespeichert.
DECLARE @MyNum FLOAT
SET @MyNum = 700000
SELECT CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),2) AS VARCHAR(10))
+ SUBSTRING('.',1,LEN(REPLACE(RTRIM(REPLACE(CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),1) AS VARCHAR(2)),'0',' ')),' ','0')))
+ REPLACE(RTRIM(REPLACE(CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),1) AS VARCHAR(2)),'0',' ')),' ','0')
Das Ergebnis ist schmerzhaft, ich weiß, aber ich bin mit viel Hilfe aus den obigen Antworten dort angekommen.
Der beste Weg ist, vor dem Konvertieren NICHT in FLOAT oder MONEY zu konvertieren, da die Gefahr eines Genauigkeitsverlusts besteht. Die sicheren Wege können also ungefähr so aussehen:
CREATE FUNCTION [dbo].[fn_ConvertToString]
(
@value sql_variant
)
RETURNS varchar(max)
AS
BEGIN
declare @x varchar(max)
set @x= reverse(replace(ltrim(reverse(replace(convert(varchar(max) , @value),'0',' '))),' ',0))
--remove "unneeded "dot" if any
set @x = Replace(RTRIM(Replace(@x,'.',' ')),' ' ,'.')
return @x
END
Dabei kann @value eine beliebige Dezimalstelle sein (x, y).
sp_
für gespeicherte Prozeduren, fn_
für Funktionen, tbl
für Tabellen und so weiter on ... dies ist keine Voraussetzung, aber dies sind bewährte Methoden zum Organisieren unserer Datenbanken.
Ich hatte ein ähnliches Problem, musste nachgestellte Nullen von Zahlen wie trimmen xx0000,x00000,xxx000
Ich benutzte:
select LEFT(code,LEN(code)+1 - PATINDEX('%[1-Z]%',REVERSE(code))) from Tablename
Code ist der Name des Feldes mit der zu schneidenden Nummer. Hoffe das hilft jemand anderem.
Andere Option...
Ich weiß nicht, wie effizient das ist, aber es scheint zu funktionieren und geht nicht über float:
select replace(rtrim(replace(
replace(rtrim(replace(cast(@value as varchar(40)), '0', ' ')), ' ', '0')
, '.', ' ')), ' ', '.')
Die mittlere Linie entfernt nachgestellte Leerzeichen, die beiden äußeren entfernen den Punkt, wenn keine Dezimalstellen vorhanden sind
Ich musste nachfolgende Nullen auf meinen Dezimalstellen entfernen, damit ich eine Zeichenfolge einer bestimmten Länge mit nur führenden Zahlen ausgeben konnte Nullen
(zB musste ich 14 Zeichen ausgeben, damit aus 142.023400 000000142.0234 wurde),
Ich habe verwendet parsename
, reverse
und cast
as int
um die nachgestellten Nullen zu entfernen:
SELECT
PARSENAME(2.5500,2)
+ '.'
+ REVERSE(CAST(REVERSE(PARSENAME(2.5500,1)) as int))
(Um dann meine führenden Nullen zu erhalten, könnte ich die korrekte Anzahl von Nullen basierend auf der Länge der obigen Werte replizieren und diese mit der Vorderseite der obigen verknüpfen.)
Ich hoffe das hilft jemandem.
Es ist möglich, führende und nachfolgende Nullen in TSQL zu entfernen
Konvertieren Sie es mit der STR TSQL-Funktion in einen String, wenn nicht mit einem String. Dann
Entfernen Sie sowohl führende als auch nachfolgende Nullen
SELECT REPLACE(RTRIM(LTRIM(REPLACE(AccNo,'0',' '))),' ','0') AccNo FROM @BankAccount
Mehr Infos im Forum .
REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(REPLACE(X,'0',' ')),' ','0'),'.',' ')),' ','.')
Wie wäre es damit? Angenommen, Daten kommen als @thisData in Ihre Funktion:
BEGIN
DECLARE @thisText VARCHAR(255)
SET @thisText = REPLACE(RTRIM(REPLACE(@thisData, '0', ' ')), ' ', '0')
IF SUBSTRING(@thisText, LEN(@thisText), 1) = '.'
RETURN STUFF(@thisText, LEN(@thisText), 1, '')
RETURN @thisText
END
case when left(replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0'), 1) = '.'
then '0'
else ''
end +
replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0') +
case when right(replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0'), 1) = '.'
then '0'
else ''
end
Ich verstehe, dass dies ein alter Beitrag ist, möchte aber SQL bereitstellen, das ich mir ausgedacht habe
DECLARE @value DECIMAL(23,3)
set @value = 1.2000
select @value original_val,
SUBSTRING( CAST( @value as VARCHAR(100)),
0,
PATINDEX('%.%',CAST(@value as VARCHAR(100)))
)
+ CASE WHEN ROUND(
REVERSE( SUBSTRING( CAST(@value as VARCHAR(100)),
PATINDEX('%.%',CAST(@value as VARCHAR(100)))+1,
LEN(CAST(@value as VARCHAR(100)))
)
)
,1) > 0 THEN
'.'
+ REVERSE(ROUND(REVERSE(SUBSTRING( CAST(@value as VARCHAR(100)),
PATINDEX('%.%',CAST(@value as VARCHAR(100)))+1,
LEN(CAST(@value as VARCHAR(100)))
)
),1))
ELSE '' END AS modified_val
Versuche dies.
select CAST(123.456700 as float),cast(cast(123.4567 as DECIMAL(9,6)) as float)
Am einfachsten ist es, den Wert als FLOAT und dann in einen String-Datentyp umzuwandeln.
CAST(CAST(123.456000 AS FLOAT) AS VARCHAR(100))
Versuche dies:
select Cast( Cast( (ROUND( 35.457514 , 2) *100) as Int) as float ) /100
Ich weiß, dass dieser Thread sehr alt ist, aber für diejenigen, die SQL Server 2012 oder höher nicht verwenden oder die FORMAT-Funktion aus irgendeinem Grund nicht verwenden können, funktioniert Folgendes.
Viele der Lösungen funktionierten auch nicht, wenn die Anzahl kleiner als 1 war (z. B. 0,01230000).
Bitte beachten Sie, dass das Folgende nicht mit negativen Zahlen funktioniert.
DECLARE @num decimal(28,14) = 10.012345000
SELECT PARSENAME(@num,2) + REPLACE(RTRIM(LTRIM(REPLACE(@num-PARSENAME(@num,2),'0',' '))),' ','0')
set @num = 0.0123450000
SELECT PARSENAME(@num,2) + REPLACE(RTRIM(LTRIM(REPLACE(@num-PARSENAME(@num,2),'0',' '))),' ','0')
Gibt 10.012345 bzw. 0.012345 zurück.
Versuche dies:
select isnull(cast(floor(replace(rtrim(ltrim('999,999.0000')),',','')) as int),0)
999999
, fordert das OP auf, die nachfolgenden Nullen zu entfernen.
Eine DECIMAL (9,6) -Spalte wird ohne Genauigkeitsverlust in float konvertiert, sodass CAST (... AS float) den Trick ausführt.
@HLGEM: zu sagen, dass Float eine schlechte Wahl für die Speicherung von Zahlen ist und "Float niemals verwenden" ist nicht korrekt - Sie müssen nur Ihre Zahlen kennen, z. B. würden Temperaturmessungen als Floats gut funktionieren.
@abatishchev und @japongskie: Präfixe vor gespeicherten SQL-Prozessen und -Funktionen sind immer noch eine gute Idee, wenn sie nicht benötigt werden. Die von Ihnen erwähnten Links weisen nur an, das Präfix "sp_" nicht für gespeicherte Prozeduren zu verwenden, die Sie nicht verwenden sollten. Andere Präfixe sind in Ordnung, z. B. "usp_" oder "spBob_".
Referenz: "Alle Ganzzahlen mit 6 oder weniger signifikanten Dezimalstellen können ohne Genauigkeitsverlust in einen IEEE 754-Gleitkommawert konvertiert werden": https://en.wikipedia.org/wiki/Single-precision_floating-point_format