แปลงค่าตัวเลขสตริงด้วยเครื่องหมายจุลภาคเป็นตัวคั่นทศนิยมเป็น NUMERIC (10, 2)


12

ฉันมีตาราง SQL ของคอลัมน์ varchar ซึ่งมีตัวเลขที่จัดรูปแบบกรีก (. เป็นตัวคั่นหลักพันและเครื่องหมายจุลภาคเป็นตัวคั่นทศนิยม)

การแปลงแบบคลาสสิก

CONVERT(numeric(10,2),REPLACE([value],',','.'))

ไม่ทำงานเพราะ (ตัวคั่นหลักพัน) ฆ่าการแปลง

เช่นลอง

CONVERT(numeric(10,2),REPLACE('7.000,45',',','.'))

ฉันต้องการแปลงค่าดังกล่าวเป็นตัวเลข (10,2)

ข้อเสนอแนะใด ๆ ของวิธีการจัดการมันได้หรือไม่

คำตอบ:


10

( หากคุณใช้ SQL Server 2012 หรือใหม่กว่าโปรดดู @ wBob สำหรับคำตอบที่สะอาดกว่าวิธีการที่ระบุไว้ในคำตอบของฉันด้านล่างจำเป็นเฉพาะเมื่อคุณใช้ SQL Server 2008 R2 หรือเก่ากว่า )

คุณไม่ต้องการ (หรือต้องการ) ตัวคั่นหลักพันเมื่อแปลงเป็นNUMERICไม่ว่าจะเป็นเครื่องหมายจุลภาคจุดหรือช่องว่างดังนั้นให้กำจัดออกก่อน จากนั้นแปลงเครื่องหมายจุลภาคเป็นจุด / ทศนิยมและคุณทำเสร็จแล้ว:

SELECT CONVERT(NUMERIC(10, 2), 
               REPLACE(
                       REPLACE('7.000,45', '.', ''),
                       ',', '.'
                      )
              ) AS [Converted];

ผลตอบแทน:

7000.45

เพื่อความสมบูรณ์ฉันควรพูดถึงว่าฉันได้ลองด้วย:

  • SET LANGUAGE Greek;

  • ดูที่รูปแบบหลากหลายสำหรับการแปลงแต่ไม่มีอะไรใช้ที่นี่

  • รูปแบบฟังก์ชั่น แต่ประเภทการป้อนข้อมูลจะต้องเป็นตัวเลขหรือวันที่ / เวลา / ค่าวันที่และเวลา (นั่นและมันได้รับการแนะนำใน SQL Server 2012 จึงไม่ใช้บังคับกับ SQL Server 2008 R2 หรือมากกว่า)

และดูเหมือนจะไม่มีอะไรอื่นทำงาน ฉันหวังว่าจะได้พบกับบางสิ่งที่หรูหรากว่าการREPLACEโทรสองสาย แต่ก็ยังไม่มีโชคเช่นนี้


แม้ว่าจะไม่ใช่โซลูชัน T-SQL ล้วนๆ แต่ก็สามารถทำได้ผ่าน SQLCLR และยังมีฟังก์ชั่นก่อนการทำที่ไม่นี้ในSQL #ห้องสมุด (ที่ผมเขียน) ชื่อString_TryParseToDecimal ฟังก์ชั่นนี้มีอยู่ในรุ่นฟรีและสามารถใช้งานได้กับ SQL Server ทุกรุ่นที่ขึ้นต้นด้วย SQL Server 2005:

SELECT SQL#.String_TryParseToDecimal('7.000,45', 'el-GR');

ผลตอบแทน:

7000.45000000000000000000

10

คุณใช้ SQL Server เวอร์ชันใดอยู่ จาก SQL Server 2012 เป็นต้นไปคุณสามารถใช้TRY_PARSEกับUSING cultureอาร์กิวเมนต์ นอกจากนี้คุณยังสามารถใช้PARSEความแตกต่างPARSEจะล้มเหลวหากการแปลงล้มเหลวและTRY_PARSEจะส่งคืน a NULLเช่น

DECLARE @t TABLE ( x VARCHAR(10) )

INSERT INTO @t
VALUES ( '7.000,45' ), ( 'xxx' )

SELECT x, 
    TRY_PARSE( x AS NUMERIC(10,2) USING 'El-GR' ) x
FROM @t

ผลการทดสอบ

HTH


2
ฉันเพิ่งเพิ่มบันทึกไปที่ด้านบนของคำตอบของฉันผู้อ่านที่นี่ถ้าพวกเขากำลังใช้ SQL Server 2012 หรือใหม่กว่า
โซโลมอน Rutzky

0

รหัสต่อไปนี้ทำงานในกรณีของฉัน:

select convert(varchar,FORMAT(123456789.0258,'###,###,###.00','de-de'))

เอาท์พุท: 123.456.789,03


หรือเลือกแปลง (varchar, FORMAT (cast (yourValue เป็นตัวเลข (10,2)), '###, ###, ###. 00', 'de-de'))
Shahed Adnan

3
ดูเหมือนว่าคุณกำลังตอบปัญหาย้อนกลับของสิ่งที่ OP ถาม พวกเขาไม่ต้องการจัดรูปแบบค่าตัวเลขพวกเขาต้องการแปลงค่า varchar ที่จัดรูปแบบเป็นตัวเลข
ypercubeᵀᴹ

1
นอกจากนี้สองบันทึก: 1)มักจะระบุความยาวสำหรับVARCHAR, NVARCHAR, CHARและNCHARประเภท ค่าเริ่มต้นคือ 30 ในบางกรณีและ 1 ในกรณีอื่น ๆ ซึ่งทำให้รหัสที่ไม่สามารถแก้ไขได้ / ผิดพลาดได้ง่าย 2)#คุณไม่จำเป็นต้องรูปแบบที่แน่นอนเมื่อใช้ คุณต้องการเพียงหนึ่งในนั้น (เช่น#) สำหรับตัวเลขทั้งหมด แต่ไม่มีตัวคั่นหลักพันหรือสองหลักคั่นด้วยเครื่องหมายจุลภาค (เช่น#,#) เพื่อรับตัวเลขทั้งหมดและตัวคั่นหลักพัน ดังนั้นSELECT CONVERT(VARCHAR(20), FORMAT(123456789.0258, N'#,#.00', N'de'));ส่งคืนผลลัพธ์เช่นเดียวกับสิ่งที่คุณกำลังแนะนำ
โซโลมอน Rutzky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.