Установить ORDER BY динамически без конкатенации строк - PullRequest
0 голосов
/ 01 мая 2018

Я использую mssql в приложении Express для запроса базы данных.

Мой код:

router.get('/expedientes', function (req, res, next) {
  request.input('pageSize', sql.Int, parseInt(req.query.page_size));
  request.query('SELECT TOP (@pageSize) * FROM expedientes', function (err, result) {
    if (err) console.log(err)
    res.send(result.recordset);
  });
});

Я хочу добавить в маршрут функцию 'order dy'. Я пытался (без удачи) это:

router.get('/expedientes', function (req, res, next) {
  request.input('pageSize', sql.Int, parseInt(req.query.page_size));
  request.input('orderBy', sql.Text, req.query.order_by);
  request.input('orderDir', sql.Text, req.query.order_dir);
  request.query('SELECT TOP (@pageSize) * FROM expedientes ORDER BY (@orderBy) (@orderDir)', function (err, result) {
    if (err) console.log(err)
    res.send(result.recordset);
  });
});

Как я могу сделать это без использования конкатенации строк? Документы не имеют четкого представления об этой функции.

1 Ответ

0 голосов
/ 01 мая 2018

Вы можете использовать CASE:

SELECT TOP (@pageSize) * 
FROM expedientes 
ORDER BY CASE 
               WHEN @OrderBy = 'col1' AND @orderDir = 'ASC' THEN col1     
               --all columns in THEN part should have the same datatype
               WHEN @OrderBy = 'col2' AND @orderDir = 'ASC' THEN col2
               --  ...
         END,

         CASE 
               WHEN @OrderBy = 'col1' AND @orderDir = 'DESC' THEN col1     
               --should have the same datatype
               WHEN @OrderBy = 'col2' AND @orderDir = 'DESC' THEN col2
               --  ...
         END DESC
--OPTION(RECOMPILE);  -- to avoid expressions in final execution plan

Демоверсия DBFiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...