|
Практика получения данных по нескольким условиям с разными приоритетами
|
|||
---|---|---|---|
#18+
Подскажите, есть ли какие-то устоявшиеся способы или рекомендации, если нужно получить из БД данные (строку) в соответствии с одним из нескольких условий, у которых имеются разные приоритеты. Допустим нужно получить значение столбца client_id из набора данных в соответствии со следующими требованиями: 1. Если есть строка с is_vip=1, то из этой строки. 2. Если в п.1 ничего нет, то для строк с заданным prio выбрать строку с минимальными prio, prio_date. 3. Если в п.2 тоже ничего нет, то из строки с минимальным order_id. Я для себя не определился, как это делать оптимально. Иногда использую cross-join для каждого условия и coalesce. Чаще использую выборки для каждого варианта, объединенные через union all, в которым добавляется числовое значение (соответствующее приоритету варианта), с последующей сортировкой и выбором rownum=1. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 15:05 |
|
Практика получения данных по нескольким условиям с разными приоритетами
|
|||
---|---|---|---|
#18+
А зачем пихать 10 pounds of shit in a 5-pound bag? Выполняй поэтапно. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 15:32 |
|
Практика получения данных по нескольким условиям с разными приоритетами
|
|||
---|---|---|---|
#18+
Поэтапно конечно проще. Но это означает, что вместо одного запроса сервер будет выполнять три, с передачей данных от клиента и обратно на каждом запросе. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 15:37 |
|
Практика получения данных по нескольким условиям с разными приоритетами
|
|||
---|---|---|---|
#18+
Alibek B. Поэтапно конечно проще. Но это означает, что вместо одного запроса сервер будет выполнять три, с передачей данных от клиента и обратно на каждом запросе. сделай функцию/процедуру на сервере ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 15:38 |
|
Практика получения данных по нескольким условиям с разными приоритетами
|
|||
---|---|---|---|
#18+
Даже на сервере это будет три переключения контекста, вместо одного. Но суть я понял, так лучше не делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 15:47 |
|
Практика получения данных по нескольким условиям с разными приоритетами
|
|||
---|---|---|---|
#18+
Alibek B. переключения контекста ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 15:50 |
|
Практика получения данных по нескольким условиям с разными приоритетами
|
|||
---|---|---|---|
#18+
Alibek B.это означает, что вместо одного запроса сервер будет выполнять три "И чо?" (с) Тебя беспокоит консистентность трёх резалт сетов или hard parse трёх простых запросов вместо одного сложного? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 15:54 |
|
Практика получения данных по нескольким условиям с разными приоритетами
|
|||
---|---|---|---|
#18+
Alibek B. Но это означает, что вместо одного запроса сервер будет выполнять три, с передачей данных от клиента и обратно на каждом запросе. Уточним. Не три а от одного до трех - как карта ляжет. И передача данных будет только от последнего. Предыдущие вернут no_data_found. sy. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 15:55 |
|
Практика получения данных по нескольким условиям с разными приоритетами
|
|||
---|---|---|---|
#18+
Можешь предоставить тестовые данные? Навскидку такой вариант: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Но не факт, что он будет лучше чем 3 юниона. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 15:56 |
|
Практика получения данных по нескольким условиям с разными приоритетами
|
|||
---|---|---|---|
#18+
Есть список тарифов, наименования которых формируются по определенному шаблону: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Эти тарифы распределены по линейкам тарифов, в пределах которой у них есть какие-то общие признаки: Код: plsql 1. 2. 3. 4. 5. 6.
Название линейки тарифов совпадает с началом названия тарифов. Но простой джойн с помощью like неприменим, потому что возможны перекрытия (например начало "Базовый" есть как в "Базовый *", так и в "Базовый Плюс *"). Поэтому приходится использовать вначале сортировать по длине совпадения, а затем группировать. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
Мне нужно из этого списка выбрать один тариф. Если есть — то из линейки "Базовый Плюс", с минимальным приоритетом и номером. Если такового нет, то любой другой, с минимальным приоритетом и номером. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Если делать это поэтапно, то раздувается рутинный код. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 16:34 |
|
|
start [/forum/topic.php?fid=52&fpage=59&tid=1881772]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 262ms |
total: | 391ms |
0 / 0 |