簡體   English   中英

ES5格式化長SQL查詢的方式

[英]ES5 way to format long SQL query

使用Google Apps腳本,我可以進行一些較長的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腳本提供了ECMA 5的子集?

不幸的是,由於只使用ECMA 5的局限性,最短/最優的方法是使用+ 您可以像@Sergey Podgornyy答案一樣安排它,使其看起來更整潔。

但是,如果您主要是想避免使用+那么這是一個巧妙的技巧。 這個想法是利用如下所示處理和使用的注釋 我們正在將一個函數作為方法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)
**/});

但是在您的情況下,您可以將dateDebdateFin中的值插入查詢中。 您將對此進行更多擴展:

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不是強類型的,因此在構建對象時必須小心。 確保正確/相應地構建了第二個參數,並且第一個參數是一個與上述示例相似的函數。

如果您只想使用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;';

如果您使用的是MySQL,則可以改用存儲過程。 存儲過程是存儲在數據庫服務器中的命名的參數化查詢。 部署存儲過程后,只需使用適當的參數調用該過程即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM