Преобразование синтаксиса из sqllite в postgresql - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть база данных sqlLite, которая содержится в некотором поле оператора SQL, этот оператор SQL необходим для создания некоторой диаграммы в приложении IOS.

Теперь мне нужно отобразить эту диаграмму в веб-приложении, которое использует Postgresql Мне нужно найти скрипт, который конвертирует из синтаксиса sqllite в синтаксис postgresql такие вещи, как printf, текущая дата и т. д. Я спрашиваю, есть ли какой-нибудь готовый скрипт для такого рода конвертации PS: я использую Symfony для серверной части, поэтому PHP

Пример:

SELECT
    r.agent                                              AS gebiet,
    r.invoiceno                                          AS rechnung,
    r.infotext                                           AS auftrag,
    c.companyno                                          AS kundenr,
    c.companyname                                        AS kunde,
    r.itemno                                             AS artikelnr,
    r.itemtext                                           AS artikel,
    SUM(r.qty) || ' ' || r.unit                          AS menge,
    printf('%.2f', SUM(r.turnover) / SUM(r.qty))         AS preis,
    printf('%.2f', SUM(r.turnover)) || ' ' || r.currency AS gesamt,
    '2'                                                  AS 'sys_align9',
    '2'                                                  AS 'sys_align10',
    '2'                                                  AS 'sys_align11'
FROM
    invoices r
INNER JOIN
    company c
ON
    r.companyno = c.companyno
WHERE
    r.agent = ?

1 Ответ

0 голосов
/ 14 сентября 2018

Отказ от ответственности: я не знаю SQLite;)

Структура запроса выглядит хорошо, но две вещи не будут работать с Postgres:

  • Я предполагаю, что printf() форматирует выходные данные с двумя десятичными знаками, поэтому to_char(), вероятно, то, что вы ищете
  • идентификаторы должны быть заключены в двойные кавычки, а не в одинарные. Так что AS 'sys_align11' должно быть `AS" sys_align11 ", но кавычки не обязательны для начала.
SELECT
    r.agent                                              AS gebiet,
    r.invoiceno                                          AS rechnung,
    r.infotext                                           AS auftrag,
    c.companyno                                          AS kundenr,
    c.companyname                                        AS kunde,
    r.itemno                                             AS artikelnr,
    r.itemtext                                           AS artikel,
    SUM(r.qty) || ' ' || r.unit                          AS menge,
    to_char(SUM(r.turnover) / SUM(r.qty), '0.00')        AS preis,
    to_char(SUM(r.turnover),'0.00') || ' ' || r.currency AS gesamt,
    '2'                                                  AS sys_align9,
    '2'                                                  AS sys_align10,
    '2'                                                  AS sys_align11
FROM
    invoices r
INNER JOIN
    company c
ON
    r.companyno = c.companyno
WHERE
    r.agent = ?

Если turnover является integer (или bigin), вам нужно привести его к числовому, иначе деление выполняется как целочисленное деление, например, SUM(r.turnover)::numeric

Поскольку вы используете агрегатную функцию, вам понадобится какой-то group by в Postgres - иначе результат не будет детерминированным.

Если invoiceno является первичным ключом таблицы invoices, достаточно 'group by r.invoiceno'.

...