|
Поиск и обновление всех вхождений подстроки в строку
|
|||
---|---|---|---|
#18+
Добрый день. Работаю с Microsoft SQL Server 2005. Есть таблица вида: ID DATA FIN_PER 1 a 1:58.57,2:58.59 2 b 10:5.25,11:6.40 3 c 111:8.29,112:7.11,113:4.41 4 d 12:16.25 в которой столбец FIN_PER представляет собой остаток средств по периодам. То что находится перед символом ":" это период (который может быть представлен одним,двумя,тремя знаками) То что находится после символа ":" до символа "," либо до конца строки - это собственно остаток средств Периодов в строке может быть очень много (грубо до 100 периодов) Задача прибавить к каждому периоду @x значение, например 3, чтобы получилось ID DATA FIN_PER 1 a 4:58.57,5:58.59 2 b 13:5.25,14:6.40 3 c 114:8.29,115:7.11,116:4.41 4 d 15:16.25 Ковырялся с substring,charindex,patindex но результата так и не добился, очень сложно. Подскажите как это сделать? (Желательно без перебора каждой строки таблицы через курсор, потому что строк в таблице очень много) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 16:32 |
|
Поиск и обновление всех вхождений подстроки в строку
|
|||
---|---|---|---|
#18+
John__Smit, string_split бы здесь был полезен... Написать свою функцию или (гораздо лучше) поменять формат хранения в таблице на нормальный. Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 16:47 |
|
Поиск и обновление всех вхождений подстроки в строку
|
|||
---|---|---|---|
#18+
John__Smit (грубо до 100 периодов) Грубо говоря или точно до 100? Рекурсией раскладываешь составные строки ("10:15.1, 15:44.44") на отдельные ("10:15.1" и "15:44.44"). С каждой отдельной строкой делаешь тёмное дело. Склеиваешь их обратно в одну общую, по общему ID. Апдейтишь таблицу новыми значениями. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 16:50 |
|
Поиск и обновление всех вхождений подстроки в строку
|
|||
---|---|---|---|
#18+
Агрох Грубо говоря или точно до 100? До 100, до 200 не имеет значения, очень много. (В таблице 32 млн записей, я не проверял каждую) (Апдейтить я буду тысяч 50 записей) Агрох Рекурсией раскладываешь составные строки ("10:15.1, 15:44.44") на отдельные ("10:15.1" и "15:44.44"). С каждой отдельной строкой делаешь тёмное дело. Склеиваешь их обратно в одну общую, по общему ID. Апдейтишь таблицу новыми значениями. Это понятно. Можно чуть подробнее как в моей ситуации это сделать? Сложность в том что у меня периоды могут задаваться разным числом знаков, я пытался писать скрипт по поиску от запятой до двоеточия, запутался. Наверняка есть красивый код который это делает. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 16:55 |
|
Поиск и обновление всех вхождений подстроки в строку
|
|||
---|---|---|---|
#18+
John__Smit, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Допилишь, используя еще CAST ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 16:59 |
|
Поиск и обновление всех вхождений подстроки в строку
|
|||
---|---|---|---|
#18+
John__Smit, 32 млн записей... А все же, зачем хранить данные в таком виде? Чтобы писать километры кода для ковыряния в нём? Может проще 1 раз сесть и навести порядок? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 17:01 |
|
Поиск и обновление всех вхождений подстроки в строку
|
|||
---|---|---|---|
#18+
John__Smit, в колонке всегда должны находиться атомарные значение, то есть те, которые нельзя логически разбить на строки. Если у вас не так, то вам надо выполнить такое разделение, добавив дополнительные колонки и скорректировать п/о для заполнения и выборки. Иначе ваша СУБД превращается в эксель. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 17:44 |
|
Поиск и обновление всех вхождений подстроки в строку
|
|||
---|---|---|---|
#18+
Gerasimenko John__Smit, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Допилишь, используя еще CAST ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 18:02 |
|
Поиск и обновление всех вхождений подстроки в строку
|
|||
---|---|---|---|
#18+
Код: 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.
Объединять по моему через FOR XML PATH(''), но подзабыл уже как точно делать. Можно и через оконные попробовать или опять рекурсией. P/S В "CAST(CAST(val1 AS int) + 5 AS VARCHAR(250)) AS val1," + 5 это то самое прибавление. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 18:06 |
|
Поиск и обновление всех вхождений подстроки в строку
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 20:58 |
|
Поиск и обновление всех вхождений подстроки в строку
|
|||
---|---|---|---|
#18+
Господа спасибо всем, но я лишь маленький винтик в системе. Понятно что структура хранения "г", но на неё заточено куча хранимых процедур. И даже если я предложу переделать её (и предположим даже нигде не накосячу), то большие дяди и тёти меня всё равно даже слушать не будут. Уважаемый invm, ваш вариант почти идеален (хоть я пока и не понимаю как это работает), вот только прибавлять @x мне нужно к периоду а не к остаткам, и что то я пока не понимаю как это допилить ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2021, 08:39 |
|
Поиск и обновление всех вхождений подстроки в строку
|
|||
---|---|---|---|
#18+
Разобрался, допилил. Прочитал документацию по использованию методов nodes, value, предложения CROSS APPLY, вспомнил замечательную функцию stuff. Уважаемый invm спасибо вам огромное, просто спасли меня (дай бог здоровья!). Постараюсь освоить данные методы в дальнейшем. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2021, 10:47 |
|
|
start [/forum/topic.php?fid=46&fpage=9&tid=1684095]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
58ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
3ms |
others: | 15ms |
total: | 179ms |
0 / 0 |