использование ANSI SQL синтаксиса для форматирования числовых - PullRequest
2 голосов
/ 09 июня 2010

Я использую две разные базы данных для моего проекта, Oracle и Apache Derby, и я стараюсь, насколько это возможно, использовать синтаксис ANSI SQL, поддерживаемый обеими базами данных.

У меня есть таблица с колонкой amount_paid NUMERIC(26,2).

Мой старый код, который использовал Oracle db, был необходим для получения значения в этом формате

SELECT LTRIM(TO_CHAR(amount_paid,'9,999,999,999,999.99'))

Как преобразовать числовое значение в такую ​​строку в формате '9,999,999,999,999,99' с использованием синтаксиса ANSI sql?

Ответы [ 2 ]

5 голосов
/ 09 июня 2010

Я думаю, что это неправильный подход. Маска формата предназначена для отображения, поэтому она действительно должна быть на уровне представления. Все, что должен сделать ваш уровень доступа к данным, это просто выполнить:

select amount_paid 
from your_table
where ....

Этот синтаксис, очевидно, будет работать с любой базой данных, к которой подключено ваше приложение.

Затем поместите код форматирования в интерфейс, где он принадлежит.

1 голос
/ 09 июня 2010

Мои знания не энциклопедические, но, насколько я знаю, нет функции ANSI, чтобы делать то, что вы хотите (хотя я был бы рад узнать, что я не прав :-).CONVERT конвертирует между наборами символов, но, насколько я могу судить, не выполняет желаемое форматирование.CAST преобразует значения между типами данных, но, опять же, не выполняет форматирование.

Если Derby не поддерживает функцию TO_CHAR в стиле Oracle, возможно, вам придется свернуть собственную функцию, давайте назовем ее MY_TO_CHAR.В Oracle реализация может быть

FUNCTION MY_TO_CHAR(nValue IN NUMBER,
                    strOracle_format IN VARCHAR2,
                    strDerby_format  IN VARCHAR2)
  RETURN VARCHAR2
IS BEGIN
  RETURN TO_CHAR(nValue, strOracle_format);
END MY_TO_CHAR;

. В Derby вы хотите определить эту функцию аналогичным образом, принимая соответствующее значение и формат и вызывая эквивалент Der_ для Derby со строкой форматирования Derby.

РЕДАКТИРОВАТЬ: я согласен с @APC - многие из этих проблем исчезают, если вам не требуется, чтобы бэкэнд выполнял основную работу.

Делитесь и наслаждайтесь.

...