Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server - PRZESYŁAJ I PODZIEL

Spróbuj tego...

DECLARE @table table(XYZ VARCHAR(8) , id int)

INSERT INTO @table
SELECT '4000', 1
UNION ALL
SELECT '3.123', 2
UNION ALL
SELECT '7.0', 3
UNION ALL
SELECT '80000', 4
UNION ALL
SELECT NULL, 5
UNION ALL
SELECT 'WTF',6

SELECT CASE 
     WHEN ISNUMERIC(XYZ) = 0 THEN NULL
     WHEN CHARINDEX('.',XYZ,0) < LEN(XYZ)-2 AND CHARINDEX('.',XYZ,0) > 0 THEN XYZ
     WHEN ISNUMERIC(XYZ) >0  then  convert(decimal(18,3),xyz) / 1000.000
     ELSE NULL
END
  FROM @table

Wyjście

4.00000000000
3.12300000000
0.00700000000
80.00000000000
NULL
NULL

Edytuj - aby zachować do 3 miejsc po przecinku na wyjściu, zrób to

SELECT convert(decimal(8,3),CASE 
     WHEN ISNUMERIC(XYZ) = 0 THEN NULL
     WHEN CHARINDEX('.',XYZ,0) < LEN(XYZ)-2 AND CHARINDEX('.',XYZ,0) > 0 THEN XYZ
     WHEN ISNUMERIC(XYZ) >0  then  convert(decimal(18,3),xyz) / 1000.000
     ELSE NULL
END)
  FROM @table

Zauważ, że (8,3) to definiuje, całkowita precyzja 8 cyfr, 3 po kropce.

Możesz też przekonwertować z powrotem na varchar(8)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zbiorczy import SQL z CSV

  2. Funkcja partycji COUNT() OVER możliwa przy użyciu DISTINCT

  3. Instalowanie Ubuntu 18.04 dla SQL Server 2019 na maszynie wirtualnej przy użyciu VMware Workstation

  4. Grupuj wiersze z odstępem krótszym niż 15 dni i przypisz min./maks. datę

  5. Jak znaleźć wszystkie procedury składowane, które wstawiają, aktualizują lub usuwają rekordy?