Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Разбиение значения поля (строковое) на составляющие  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 740
В обобщенном поле "НАИМЕНОВАНИЕ" (таблицы Table1) хранится информация о товаре в следующем виде

ID Наименование
1 Авто № 608
2 Лодка 125 "Надувная"
3 Лодка № 192 Железная
4 пустота
5 Кон-р лего №54 "Заправка"
6 Игрушка Танк

Поле "Наименование" мне нужно разнести в 3 поля другой таблицы (таблицы Table2)
Тип_товара
Номер_товара
Название_товара

вот так
ID Тип_товара Номер_товара Название_товара
1 Авто 608
2 Лодка 125 Надувная
3 Лодка 192 Железная
4
5 Кон-р лего 54 Заправка
6 Игрушка Танк

т.е. избавится от символа если он есть, двойных кавычек если они есть и лишних пробелов одновременно
Т.е. ситуация не простая (для моих познаний функий скл по работе со строками) - нужно сначала, как мне представляется

1) ДЛЯ ПОЛЯ "Тип_товара" вырезать из поля "НАИМЕНОВАНИЕ" по правилу:
- обрезаем СЛЕВА до вхождения первого ЦИФРОВОГО символа, т.к. не везде есть символ "" (например, цифры 6 из номера товара 608), далее если в обрезанном фрагменте есть символ "", то убрать его
REPLACE(полученная подстрока,'№','')

2) ДЛЯ ПОЛЯ "Номер_товара" вырезать из поля "НАИМЕНОВАНИЕ" лишь его цифровую составляющую (608, 125, 192). Если номер товара не содержится в Наименовании, то ничего и не вставлять/заменять

3) ДЛЯ ПОЛЯ "Название_товара" вырезать из поля "НАИМЕНОВАНИЕ" по правилу:
- обрезаем СПРАВА до вхождения первого ЦИФРОВОГО символа (например, цифры 8 из номера товара 608), далее если в обрезанном фрагменте есть символ двойных кавычек ", то убрать его
REPLACE(полученная подстрока,'"','')

update Table2 set  
Тип_товара=...
Номер_товара=...
Название_товара=...
From Table1 
INNER JOIN Table2 ON Table1.ID=Table2.ID
12 авг 11, 10:40    [11107940]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
Glory
Member

Откуда:
Сообщений: 104751
И с чем конкретно у вас возникли проблемы ?
12 авг 11, 10:50    [11108021]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 740
Glory
И с чем конкретно у вас возникли проблемы ?


с функциями выделения подстрок, обрезки, поиска цифрового символа - те пункты что я описала
12 авг 11, 10:54    [11108052]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ольга Семенова
с функциями выделения подстрок, обрезки, поиска цифрового символа - те пункты что я описала

функция выделения подстрок называется SUBSTRING
функция поиска символов называется PATINDEX()
Список вообще всех функций можно найти в хелпе в статье Functions (Transact-SQL)
12 авг 11, 10:59    [11108082]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Ольга Семенова,

версия сервера - секрет?
По-моему, Вы ещё ни разу в жизни никому её не называли (пролистал Ваши темы по диагонали)

А парсинг строк тут рассматривался сотни раз.
Тут главное формализовать формат Ваших данных.
Иначе неясно, как определить конец одного фрагмента и начало другого.
12 авг 11, 11:31    [11108377]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 740
iap
Ольга Семенова,

версия сервера - секрет?
По-моему, Вы ещё ни разу в жизни никому её не называли (пролистал Ваши темы по диагонали)


версия 2005
12 авг 11, 11:44    [11108488]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
1. Убрать № и двойные кавычки
2. Вырезать начало строки функцией LEFT до цифры, положение которой определить функцией PATINDEX.
Обратить особое внимание на 0, который возвращает PATINDEX, если ничего не найдено
3. Выкусить все цифры от позиции, найденной PATINDEX в п.2 до первой нецифры после этого места.
Например, подойдет PATINDEX, которому передать STUFF, заменяющий всё начало строки до первой цифры на пустую строку
4. Перевернуть строку функцией REVERSE, выполнить п.2, перевернуть результат ещё раз.
5. Каждый выбранный в предыдущих пунктах фрагмент поместить в функции LTRIM(RTRIM()), чтобы убрать лишние пробелы

Ну что, разве это так сложно?
12 авг 11, 12:00    [11108644]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 740
iap
1. Убрать № и двойные кавычки
2. Вырезать начало строки функцией LEFT до цифры, положение которой определить функцией PATINDEX.
Обратить особое внимание на 0, который возвращает PATINDEX, если ничего не найдено
3. Выкусить все цифры от позиции, найденной PATINDEX в п.2 до первой нецифры после этого места.
Например, подойдет PATINDEX, которому передать STUFF, заменяющий всё начало строки до первой цифры на пустую строку
4. Перевернуть строку функцией REVERSE, выполнить п.2, перевернуть результат ещё раз.
5. Каждый выбранный в предыдущих пунктах фрагмент поместить в функции LTRIM(RTRIM()), чтобы убрать лишние пробелы

Ну что, разве это так сложно?


1) все это можно прям в одном запросе без временных таблиц сделать?

2)
автор
1) ДЛЯ ПОЛЯ "Тип_товара" вырезать из поля "НАИМЕНОВАНИЕ" по правилу:
- обрезаем СЛЕВА до вхождения первого ЦИФРОВОГО символа, т.к. не везде есть символ "№" (например, цифры 6 из номера товара 608), далее если в обрезанном фрагменте есть символ "№", то убрать его


Игрушка Танк полностью пойдет в Тип товара.
автор
Обратить особое внимание на 0, который возвращает PATINDEX, если ничего не найдено

это избавит от этого?
12 авг 11, 14:47    [11110139]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Ольга Семенова
1) все это можно прям в одном запросе без временных таблиц сделать?

результат работы одной функции можно использовать как аргумент при вызове второй и т.д.
12 авг 11, 15:08    [11110358]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Ольга Семенова
Игрушка Танк полностью пойдет в Тип товара.
Не надо здесь цитировать посторонних графоманов, ладно?

Да. Если PATINDEX вернёт 0 при формировании первой части, то результат - вся строка.
Если он же вернёт 0 для третьей части (для перевёрнутой строки), то результат - NULL или пустая строка на Ваш вкус.
Это же так просто, правда?
12 авг 11, 15:16    [11110448]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Ольга Семенова,

я, если заметили, умышленно не пишу готовый SELECT (он один получится, естественно)
в надежде, что Вас посетит озарение.

Посмотрите ещё на функции NULLIF (чтобы подменить нехороший 0 от PATINDEX на NULL)
и ISNULL, чтобы получившийся результирующий NULL заменить на то, что Вам надо.

Надеюсь увидеть правильное решение в Вашем следующем сообщении
Потому что вроде абсолютно всё описал словами...
12 авг 11, 15:25    [11110537]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 740
iap
Ольга Семенова,

я, если заметили, умышленно не пишу готовый SELECT (он один получится, естественно)
в надежде, что Вас посетит озарение.

Посмотрите ещё на функции NULLIF (чтобы подменить нехороший 0 от PATINDEX на NULL)
и ISNULL, чтобы получившийся результирующий NULL заменить на то, что Вам надо.

Надеюсь увидеть правильное решение в Вашем следующем сообщении
Потому что вроде абсолютно всё описал словами...


а не подскажите где можно виртульную БД развернуть, создать там мои тестовые таблицы и проверять запросы. У оракла такое есть знаю :) - давным давно делала. Вот не помню что за сервис. ПОДСКАЖИТЕ
На рабочей БД я просто боюсь этого делать
12 авг 11, 17:10    [11111660]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Ольга Семенова
а не подскажите где можно виртульную БД развернуть, создать там мои тестовые таблицы и проверять запросы. У оракла такое есть знаю :) - давным давно делала. Вот не помню что за сервис. ПОДСКАЖИТЕ
На рабочей БД я просто боюсь этого делать
Поднимите из бэкапа копию.
12 авг 11, 17:12    [11111671]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ольга Семенова
а не подскажите где можно виртульную БД развернуть, создать там мои тестовые таблицы и проверять запросы.

Вы уже вроде создавали тему о восстановлении бэкапа базы на другом сервере
12 авг 11, 17:13    [11111680]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 740
Гавриленко Сергей Алексеевич
Ольга Семенова
а не подскажите где можно виртульную БД развернуть, создать там мои тестовые таблицы и проверять запросы. У оракла такое есть знаю :) - давным давно делала. Вот не помню что за сервис. ПОДСКАЖИТЕ
На рабочей БД я просто боюсь этого делать
Поднимите из бэкапа копию.


из бекапа мне не нужно - мне виртуальную БД создать
есть же ведь такие сервисы - просто напомните ссылку. Чтобы именно через интернет можно было заходить и тестировать, т.к. выходные нету доступа к серверу БД - он на работе расположен :)
12 авг 11, 17:20    [11111726]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Ольга Семенова
Гавриленко Сергей Алексеевич
пропущено...
Поднимите из бэкапа копию.


из бекапа мне не нужно - мне виртуальную БД создать
есть же ведь такие сервисы - просто напомните ссылку. Чтобы именно через интернет можно было заходить и тестировать, т.к. выходные нету доступа к серверу БД - он на работе расположен :)
Дома сервер поднимите. А про заходить и через интернет тестировать - у вас много лишних денег, что ли?
12 авг 11, 17:22    [11111735]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ольга Семенова
из бекапа мне не нужно - мне виртуальную БД создать

Виртуальные - это которые в воображении что ли существуют ?

Ольга Семенова
есть же ведь такие сервисы - просто напомните ссылку

www.no-drugs.com ???

Ольга Семенова
Чтобы именно через интернет можно было заходить и тестировать

Это называется хостинг
12 авг 11, 17:23    [11111756]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 740
Гавриленко Сергей Алексеевич
Ольга Семенова
пропущено...


из бекапа мне не нужно - мне виртуальную БД создать
есть же ведь такие сервисы - просто напомните ссылку. Чтобы именно через интернет можно было заходить и тестировать, т.к. выходные нету доступа к серверу БД - он на работе расположен :)
Дома сервер поднимите. А про заходить и через интернет тестировать - у вас много лишних денег, что ли?


да при чем здесь деньги... вам трудно назвать сервис для создания виртульной БД ?
и дома стоит винда ХП - под нее нет 2005 сервера и дома она мне и не нужна
12 авг 11, 17:24    [11111758]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ольга Семенова
да при чем здесь деньги... вам трудно назвать сервис для создания виртульной БД ?

А вам не трудно указать источник, из которого вы почерпнули этот термин - "виртуальная база данных" ?

Ольга Семенова
и дома стоит винда ХП - под нее нет 2005 сервера

Есть
12 авг 11, 17:25    [11111767]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Glory
Ольга Семенова
и дома стоит винда ХП - под нее нет 2005 сервера

Есть
Вот, сижу сейчас дома, а у меня XP и SQL2008 Developer Edition стоят.
Это если про существование бесплатной Express забыть.

Если нужны какие-то мелкие эксперименты, я использую tempdb на рабочем или на тестовом сервере.
Но у нас почему-то такие права на tempdb не у всех есть.
Не знаю, насколько это общепринято...
12 авг 11, 18:19    [11112068]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Да дайте ей уже ключевые фразы для гугления: VirtualPC/Virtual Server.
Но и кстати да - если нет особых причин НЕ ставить SQL под XP (нy там места на диске жалко...) - ставьте и работайте на здоровье из дома.
12 авг 11, 18:20    [11112082]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Ольга Семенова
и дома стоит винда ХП - под нее нет 2005 сервера и дома она мне и не нужна

Вы уже не первая, кто это утверждает. Скажите, откуда этот слух пополз, что под XP не работают 2005 и 2008 серверы?
12 авг 11, 19:31    [11112422]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 740
iap
Ольга Семенова,

1. Убрать № и двойные кавычки
2. Вырезать начало строки функцией LEFT до цифры, положение которой определить функцией PATINDEX.
Обратить особое внимание на 0, который возвращает PATINDEX, если ничего не найдено

Посмотрите ещё на функции NULLIF (чтобы подменить нехороший 0 от PATINDEX на NULL)
и ISNULL, чтобы получившийся результирующий NULL заменить на то, что Вам надо.



update Table2 T2 set  
Тип_товара=LEFT(REPLACE(REPLACE(T1.Наименование,'"',''), '№', ''), ISNULL(NULLIF(PATINDEX('[1-9]',T1.Наименование), 0), '')  )  ,
From Table1 T1

все заполнилось '' :( . В чем промах?
12 авг 11, 19:32    [11112429]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 740
а если

update Table2  set  
Тип_товара=LEFT(REPLACE(REPLACE(T1.Наименование,'"',''), '№', ''), ISNULL(NULLIF(PATINDEX('[1-9]',T1.Наименование), 0), '')  )  ,
From Table1 as T1
where T1.ID=T2.ID

то
автор
Сообщение 4104, уровень 16, состояние 1, строка 3
The multi-part identifier "T2.ID" could not be bound.


я тестовые таблицы сделала и заполнила как
Table1
автор
ID Наименование
1 Авто № 608
2 Лодка 125 "Надувная"
3 Лодка № 192 Железная
4 пустота
5 Кон-р лего №54 "Заправка"
6 Игрушка Танк


Table2
автор
ID Тип_товара Номер_товара Название_товара
1
2
3
4
5
6
12 авг 11, 20:24    [11112611]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение значения поля (строковое) на составляющие  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
UPDATE T2 SET
 Тип_товара=LTRIM(U.Тип_товара)
,Номер_товара=LTRIM(ISNULL(LEFT(U.НомерНазвание, NULLIF(PATINDEX('%[^0-9]%',U.НомерНазвание),0)-1),U.НомерНазвание))
,Название_товара=LTRIM(REVERSE(ISNULL(LEFT(REVERSE(U.НомерНазвание), NULLIF(PATINDEX('%[0-9]%', REVERSE(U.НомерНазвание)),0)-1),'')))
FROM Table2 T2
JOIN
(
 SELECT
  ID,
  ISNULL(LEFT(Наименование, NULLIF(PATINDEX('%[0-9]%',Наименование),0)-1),Наименование)[Тип_товара],
  ISNULL(STUFF(Наименование,1, NULLIF(PATINDEX('%[0-9]%',Наименование),0)-1,''),'')[НомерНазвание]
 FROM
 (
  SELECT
   ID,
   REPLACE(REPLACE(Наименование,'№',''),'"','')[Наименование]
  FROM Table1
 ) T
) U
ON T2.ID=U.ID;
Разбирайтесь с Игрушкой-Танком!
12 авг 11, 21:53    [11112972]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить