ES5 способ отформатировать длинный запрос SQL - PullRequest
0 голосов
/ 29 января 2019

С помощью Google Apps Script у меня есть длинный SQL-запрос, подобный следующему:

var query = "SELECT od.`product_reference`, od.`product_name`, SUM(od.`product_quantity`) AS 'cpt' " +
    "FROM `ps_order_detail` od " +
    "JOIN `ps_orders` o ON o.`id_order` = od.`id_order` " +
    "WHERE od.`product_reference` NOT LIKE ('%GIFT%') " +
    "AND o.`date_add` BETWEEN " + dateDeb + " AND " + dateFin + " " +
    "GROUP BY `product_id` " +
    "ORDER BY cpt DESC " +
    "LIMIT 10;";

Мне это показалось уродливым, знаете ли вы лучший способ отформатировать этот запрос?зная, что Google Apps Script предоставляет подмножество ECMA 5?

Ответы [ 3 ]

0 голосов
/ 29 января 2019

К сожалению, с вашим ограничением просто работать с ECMA 5, самый короткий / оптимальный способ сделать это с +.Вы можете расположить его так: @ Сергей Подгорный * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * s.Идея заключается в использовании комментариев , которые обрабатываются и используются, как показано ниже.Мы передаем функцию в качестве первого аргумента метода multipleLineString.Эта функция анализируется на строку, которая включает в себя комментарии.Если вы достаточно осторожны, вы можете выполнить следующую работу:

var multipleLineString = function(f) {
    return f.toString().split('\n').slice(1, -1).join('\n');
}

var sqlQuery = multipleLineString (function() {/**
First Line
'Second' Line
"Third" Line (3)
**/});

Но в вашем случае у вас есть значения от dateDeb и dateFin для вставки в запрос.Вам придется немного расширить это до следующего:

var multiLine = function (f, dictionary) {
    var compiledString = f.toString().split('\n').slice(1, -1).join('\n');
    for (var key in dictionary) {
        compiledString = compiledString.replace(new RegExp(key, 'g'), dictionaty[key].toString());
    }
    // Add other enhancements before return (e.g. trimming & cleaning multiple white spaces)
    return compiledString;
}

var query = multiLine (function() {/**
    SELECT od.`product_reference`, od.`product_name`, SUM(od.`product_quantity`) AS 'cpt' 
    FROM `ps_order_detail` od 
    JOIN `ps_orders` o ON o.`id_order` = od.`id_order` 
    WHERE od.`product_reference` NOT LIKE ('%GIFT%') 
    AND o.`date_add` BETWEEN _dateDeb AND _dateFin 
    GROUP BY `product_id` 
    ORDER BY cpt DESC 
    LIMIT 10;
    **/},
    {
        _dateDeb: dateDeb,
        _dateFin: dateFin
    }
);

Объяснение выше: второй аргумент, dictionary, является своего рода объектом «пара ключ-значение», так что мы можемопределить ключевые слова в комментарии (_dateDeb и _dateFin) из первого аргумента и их соответствующие значения, которые будут заменены.Как и в C # Dictionary .Но вы должны быть осторожны при создании объекта, поскольку JS не является строго типизированным.Убедитесь, что 2-й аргумент построен правильно / соответствующим образом, а 1-й аргумент является функцией, которая похожа на приведенные выше примеры.

0 голосов
/ 29 января 2019

Если вы используете MySQL, вы можете вместо этого использовать хранимые процедуры.Хранимая процедура - это именованный параметризованный запрос, хранящийся на сервере базы данных.После развертывания хранимой процедуры вы просто вызываете процедуру с соответствующими параметрами.

0 голосов
/ 29 января 2019

Если вы хотите просто отформатировать эту строку с ES6, то, вероятно, лучшим способом для этого будет «шаблонная строка»:

const query = `
  SELECT 
    od.product_reference,
    od.product_name,
    SUM(od.`product_quantity`) AS 'cpt'
  FROM ps_order_detail od 
  JOIN ps_orders o ON o.id_order = od.id_order
  WHERE
    od.product_reference NOT LIKE ('%GIFT%')
    AND o.date_add BETWEEN ${dateDeb} AND ${dateFin}
  GROUP BY product_id
  ORDER BY cpt DESC
  LIMIT 10;
`;

Если вам требуется поддержка ES5:

var query = ''
  + 'SELECT '
  + '  od.product_reference, '
  + '  od.product_name, '
  + '  SUM(od.`product_quantity`) AS \'cpt\' '
  + 'FROM ps_order_detail od '
  + 'JOIN ps_orders o ON o.id_order = od.id_order '
  + 'WHERE '
  + '  od.product_reference NOT LIKE (\'%GIFT%\') '
  + '  AND o.date_add BETWEEN ' + dateDeb + ' AND ' + dateFin + ' '
  + 'GROUP BY product_id '
  + 'ORDER BY cpt DESC '
  + 'LIMIT 10;';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...