Перетворити рядкові числові значення з комою у вигляді десяткового роздільника в NUMERIC (10, 2)


12

У мене є SQL таблиця стовпців varchar, що містять відформатовані грецькими цифрами (як тисяча роздільник і кома як десятковий роздільник)

Класичне перетворення

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

не працює, тому що. (тисяча роздільник) вбиває конверсію

Наприклад, спробуйте

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

Я хочу перетворити такі значення в числові (10,2)

Будь-які пропозиції, як з цим впоратися?

Відповіді:


10

( Якщо ви використовуєте 2012 або більш пізню версію SQL Server, будь ласка , см @ wBob в відповідь на більш чистий підхід. Підхід , викладений в моїй обороні нижче тільки потрібно , якщо ви використовуєте SQL Server 2008 R2 або старше. )

Вам не потрібен (або хочете) роздільник тисяч при переході на нього NUMERIC, незалежно від того, це кома, період чи пробіл, тому просто спочатку позбудьтесь їх. Потім перетворіть кому в крапку / десяткову, і ви закінчите:

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

Повернення:

7000.45

Для повноти я повинен зазначити, що я також намагався:

  • SET LANGUAGE Greek;

  • Дивлячись на різні стилі формату CONVERT , але тут нічого не застосовується.

  • Функція FORMAT , але тип введення повинен бути числовим або датою / часом / датою часу (це було введено в 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 або новішу версію.
Соломон Руцький

0

У моєму випадку працював такий код:

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

вихід: 123.456.789,03


або виберіть конвертувати (varchar, FORMAT (литий (вашValue як числовий (10,2)), '###, ###, ###. 00', 'de-de'))
Shahed Adnan

3
здається, ви відповідаєте на зворотну проблему того, про що попросила ОП. вони не хочуть форматувати числові значення, вони хочуть перетворити відформатовані значення вархара в числові.
ypercubeᵀᴹ

1
Крім того , два зауваження: 1) завжди вказувати довжину VARCHAR, NVARCHAR, CHARі NCHARтипів. За замовчуванням - 30 в деяких випадках і 1 в інших випадках, що спричиняє неможливий / схильний до помилок код. 2) точний макет вам не потрібен #. Вам просто потрібна одна з них (наприклад #) для всіх цифр, але немає роздільника тисяч, або дві з них, розділені комою (наприклад #,#), щоб отримати всі цифри та роздільник тисяч. Отже, SELECT CONVERT(VARCHAR(20), FORMAT(123456789.0258, N'#,#.00', N'de'));повертається той самий вихід, що і пропонований вами.
Соломон Руцький
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.