Postgresql условный заказ с несколькими случаями - PullRequest
0 голосов
/ 27 апреля 2020

Итак, у меня есть рабочий порядок на языке Postgresql plpg sql, который выглядит примерно так:

....
order by (CASE WHEN _sortcol='col_1' and _sortdir='desc' THEN col_1 end) desc NULLS LAST,
         (CASE WHEN _sortcol='col_2' and _sortdir='desc' THEN col_2 end) desc NULLS LAST,
         (CASE WHEN _sortcol='col_3' and _sortdir='desc' THEN col_3 end) desc NULLS LAST,
         ......
         (CASE WHEN _sortcol='col_N' and _sortdir='asc' THEN col_N end) NULLS LAST,
         (CASE WHEN _sortcol='col_N1' and _sortdir='asc' THEN col_N1 end) NULLS LAST,

Все работает нормально, но этот порядок по пунктам - огромный беспорядок, пока я есть большая таблица с большим количеством столбцов. Есть ли место для улучшения и оптимизации кода, чтобы этот код занимал гораздо меньше визуального пространства?

1 Ответ

1 голос
/ 27 апреля 2020

Хотя Dynami c SQL следует использовать редко, это тот случай, когда производительность, вероятно, будет лучше:

BEGIN
  ..
  EXECUTE format('SELECT .. ORDER BY %I %s', _sortcol, 
    CASE _sortdir WHEN 'desc' THEN 'desc'
                  WHEN 'asc' THEN 'asc'
                  ELSE 'asc' END);

Когда вы используете Dynami c SQL, то у вас есть каждый раз думать о защите от SQL инъекций. Каждый строковый параметр должен быть экранирован или ограничен только безопасным значением.

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