Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
case запрос
|
|||
|---|---|---|---|
|
#18+
Есть запрос с несколько сотней условий, условия постоянно добавляются, появилась необходимость вынести условия в отдельную таблицу, с вызовом вложенного запроса или хранимой процедуры. Подскажите как грамотно написать подобный запрос. БД MSSQL select case when a = 1 then b + 10 when a = 2 then b + a when a = 3 then b - a when a = 4 then b + 5 end from table1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 11:31 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
Sion, посмотрите в сторону CHOOSE , SQL Server 2012 и выше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 11:43 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
Если я правильно понял вашу задачу, вам нужно вынести вычисления в отдельный модуль. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 11:52 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
Владимир Затуливетер, вы верно поняли вычисления нужно вынести в отдельный модуль но данные нужно вынести в отдельную таблицу т.е. в новой таблице, назовем table2 (a, b), должны быть занесены условия и результат ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 12:35 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
nullin, на сколько я понимаю данный оператор не получится обработать если будет сложное условие? when a > 1 and a < 10 and a < b then b + 10 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 12:37 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
Владимир Затуливетер, вспомогательная таблица должна хранить условия и результат insert into table2 (where,result) values ("a>1 and a<10", "b") insert into table2 (where,result) values ("a = 1", "b+10") insert into table2 (where,result) values ("a = 2", "b+a") insert into table2 (where,result) values ("a=3", "b-5") insert into table2 (where,result) values ("a=4", "b+5") insert into table2 (where,result) values ("a>1 and a<10", "b=5") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 12:43 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
SionВладимир Затуливетер, вспомогательная таблица должна хранить условия и результат insert into table2 (where,result) values ("a>1 and a<10", "b") insert into table2 (where,result) values ("a = 1", "b+10") insert into table2 (where,result) values ("a = 2", "b+a") insert into table2 (where,result) values ("a=3", "b-5") insert into table2 (where,result) values ("a=4", "b+5") insert into table2 (where,result) values ("a>1 and a<10", "b=5") 1. такую ересь разрешит только динамика 2. нужен приоритет для условий 3. на больших объектах , та и на других это будет ой как не весело ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 12:54 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
Sion, автордолжны быть занесены условия и результат это задача прикладного уровня, а не базы данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 13:10 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
Sion, для решения задачи на уровне СУБД необходимо создать таблицу с перечислением всех известных значений А (ключ) и списком смещений Б для каждого значения ключа. Затем использовать объединение в запросе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 13:15 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
Напишите SQL-функцию(и) с вычислениями. Ф-ция пусть ч-л зачитывает из настроечных таблиц, которых может быть много. Если алгоритм изменится, то ее(их) можно будет на лету изменить не трогая прочих программ. Это и будет той самой динамикой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 14:42 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
Вот можете попробовать. Но это извращение в SQL Server такое обычно не делают. Как уже выше говорили нужно чтобы условия которые мы пихаем в таблицу были закодированы, например были в функции которую я выше скинул. Функция будет большой, но если правильно отформатировать то думаю не должно быть большой проблемой. Код: sql 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. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 17:44 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
А чем простейший вариант не устраивает? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 18:10 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
SionВладимир Затуливетер, вспомогательная таблица должна хранить условия и результат insert into table2 (where,result) values ("a>1 and a<10", "b") insert into table2 (where,result) values ("a = 1", "b+10") insert into table2 (where,result) values ("a = 2", "b+a") insert into table2 (where,result) values ("a=3", "b-5") insert into table2 (where,result) values ("a=4", "b+5") insert into table2 (where,result) values ("a>1 and a<10", "b=5")Варианта два: 1. Использовать динамический SQL, как предложил Владимир Затуливетер 2. Сделать триггер на таблицу, который будет создавать функцию (процедуру, вьюху) для вычислений на основе данных таблицы (и соответственно пересоздавать их при изменении условий). Что лучше - зависит от задачи. Если речь о каком то универсальном репорте, и фактически вычисления будут в одном месте, то можно использовать вариант 1 Если эти вычисления будут разбросаны по коду, по куче запросов/процедур, то лучше 2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 18:47 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
Remind, в вашем вариант идет денормализация данных. В случае с case мы получим один единственный результат на выходе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 20:22 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
Владимир Затуливетер, спасибо за помощь. вы уж простите никогда не писал хранимок по T-SQL в основом на PL-SQL ваял код в ранние годы, конструкции конструктивно разные. возникла мысль завернуть case условие в процедуру (закодировать) select case when a>1 then b ..... when a=1 then b+5 end, table1.id frоm table1 на выходе получить запрос select getResultFromTable2(a,b), table1.id frоm table1 при добавлении в таблицу нового условия повесить триггер на изменение для перезаписи хранимой процедуры. поможете с реализацией триггера и процедуры ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 20:48 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
Sionвозникла мысль завернуть case условие в процедуруВ функцию. Код: sql 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. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 21:40 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
invm, то что нужно, спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 21:56 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
invm, для удобства понимания по какому условию происходит расчет, надо еще вывести номер приоритета. как в вашу функцию добавить вывод приоритета не прибегаю к созданию отдельного запроса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 10:37 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
Sion, Код: sql 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. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 11:25 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
invm, добрый день, к сожалению не работает в случае со строками Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 21:33 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
Sion, Ну вы уж сами давайте поднапрягитесь и исправьте ошибку. Или хотите чтобы мы все за вас написали? "не работает" - там же наверное ошибка какая-то появляется? ее и исправляйте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 22:17 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
Владимир Затуливетер, в самой функции это сделать не сложно Код: sql 1. заменить часть кода на Код: sql 1. но когда я смотрю обработку триггера не понимаю где нужно поправить. типы [@Result] выносят мозг пару часов сидел, не выдержал, прошу помощи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 22:28 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
Sion, Поправьте в триггере формирование case'а Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 22:41 |
|
||
|
case запрос
|
|||
|---|---|---|---|
|
#18+
invm, спасибо я как раз хотел задать вопрос почему на условие then необходимо 4 кавычки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 22:52 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39688156&tid=1689253]: |
0ms |
get settings: |
14ms |
get forum list: |
24ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
87ms |
get tp. blocked users: |
2ms |
| others: | 239ms |
| total: | 432ms |

| 0 / 0 |
