Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 убрать лишнее в колонке строки  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
в некоторых полях одной строки данные перечисляются и выводятся через ",", при этом данные разные. то есть операторы LIKE %% и Replace не подходят. это информация об IPадресе ПК. я вычитываю и иногда получаю адреса IPv4 и IPv6,

например,
PC1 - 192.168.10.10, fe80::7c94:d03b:7438:3980;
PC2 - 192.168.10.121, fe80::50f9:a111:394c:2c44;

Нужно оставить только адрес IPv4. Но IPv6 начинается у всех на fe80.. подскажите, как это осуществить?
6 фев 15, 11:05    [17226914]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а чем substring +pathindex не угодил ?
6 фев 15, 11:21    [17227026]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
seeerg_23,

ну, еще функции всякие есть.
charindex, patindex - чтобы найти позицию символа/шаблона
left, right, substring - чтобы выбрать часть строки
6 фев 15, 11:23    [17227049]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
west74
Member

Откуда: Челябинск
Сообщений: 76
чем проще , тем лучше

declare @t table
(pc varchar(100))

insert into @t values ('PC1 - 192.168.10.10, fe80::7c94:d03b:7438:3980;'),
('PC2 - 192.168.10.121, fe80::50f9:a111:394c:2c44;')

select substring(pc,1,CHARINDEX(',',pc)-1),pc from @t
6 фев 15, 12:07    [17227443]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
это уже ближе к результату, но всё равно не то. например, substring будет использоваться корректно, когда мы знаем точное количество символов. а у меня это плавающее значение, потому как в PC1 - 13 символов надо оставить (считать), в PC2 - 14, а в PC100 - 8..

PC1 - 192.168.10.10, fe80::7c94:d03b:7438:3980;
PC2 - 192.168.10.121, fe80::50f9:a111:394c:2c44;
....
PC100 - 10.2.5.9, fe80::......
9 фев 15, 10:38    [17236968]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
seeerg_23
когда мы знаем точное количество символов.

Не считайте символы, считайте разделители
9 фев 15, 10:39    [17236974]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
vova ivanov
Member [заблокирован]

Откуда:
Сообщений: 1090
seeerg_23
это уже ближе к результату, но всё равно не то. например, substring будет использоваться корректно, когда мы знаем точное количество символов. а у меня это плавающее значение, потому как в PC1 - 13 символов надо оставить (считать), в PC2 - 14, а в PC100 - 8..
CHARINDEX для этого и используется
ты бы проверил, то что тебе предложили сначала ...
9 фев 15, 10:41    [17236987]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
PC1-PC100 - это просто идентификаторы в примере. вот запрос, который частично подходит, где имя поля IPAddr.

если дано
192.168.10.10, fe80::7c94:d03b:7438:3980
192.168.10.121, fe80::50f9:a111:394c:2c44
то запрос

SELECT SUBSTRING(IPAddr, 1, CHARINDEX(',', IPAddr)) AS IP FROM T1

выводит
192.168.10.10,
192.168.10.121,

в этом случае всё правильно. НО, не всегда присутствует IPv6. Например, в строке 50 в поле IPAddr будет только адрес 10.15.45.78 и для него запрос выводит пустую строку. Если в CHARINDEX поиск сделать не по ',' , а по пробелу ' ' , то результат тот же - пустая строка. как в этом случае сделать поиск ? может сделать поиск по ЗАПЯТОЙ и по КОНЦУ СТРОКИ, но как это соединить в одном SUBSTRING ?
9 фев 15, 12:35    [17237874]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
seeerg_23
в этом случае всё правильно. НО, не всегда присутствует IPv6. Например, в строке 50 в поле IPAddr будет только адрес 10.15.45.78 и для него запрос выводит пустую строку. Если в CHARINDEX поиск сделать не по ',' , а по пробелу ' ' , то результат тот же - пустая строка. как в этом случае сделать поиск ? может сделать поиск по ЗАПЯТОЙ и по КОНЦУ СТРОКИ, но как это соединить в одном SUBSTRING ?

распарсите вашу строку по нужному разделителю
И возьмите из результатов парсинга нужный по порядковому номеру элемент.
9 фев 15, 12:42    [17237918]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
можно пример таких действий?
9 фев 15, 13:02    [17238067]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
seeerg_23
можно пример таких действий?

Каких именно "таких" ?
Вариантов парсинга строки только на этом форуме несколько сотен уже.
9 фев 15, 13:03    [17238082]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
petre
Member

Откуда: Кривой Рог
Сообщений: 42
seeerg_23,

SELECT case 
          when  CHARINDEX(',', IPAddr)) <>0 then SUBSTRING(IPAddr, 1, CHARINDEX(',', IPAddr))
         else IPAddr  end AS IP FROM T1 
9 фев 15, 13:26    [17238234]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
мой старый запрос выглядит так:
......
(SELECT  T9.IPAddr + '  ' AS 'data()'
 FROM     dbo.NETWORK T9
 WHERE   T9.ID = T1.ID FOR xml path('')) AS [IPv4 IPv6],
......


и если к Т9 применить работающий запрос с WHEN
(SELECT  T9.(CASE WHEN CHARINDEX(',', IPAddr) <> 0 
                   THEN SUBSTRING(IPAddr, 1, CHARINDEX(',', IPAddr) 
                   ELSE IPAddr 
                   END) + '  ' AS 'data()'
 FROM     dbo.NETWORK T9
 WHERE   T9.ID = T1.ID FOR xml path('')) AS IPv4,

то выдаётся ошибка, не срабатывает


то выдаётся ошибка.
10 фев 15, 09:31    [17242308]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
seeerg_23
то выдаётся ошибка, не срабатывает

А кто вас учил ставить имя таблицы перед функцией/выражением ?
10 фев 15, 10:10    [17242509]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
интуиция
10 фев 15, 10:22    [17242608]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
seeerg_23
интуиция

Хреновая интуиция
10 фев 15, 10:23    [17242623]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
а как надо? в том-то и вопрос.
10 фев 15, 10:49    [17242846]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
seeerg_23
а как надо? в том-то и вопрос.

Не надо ставить алиас таблицы там, где вы не знаете.
Алиасы используют только с именами полей.
10 фев 15, 11:02    [17242987]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
то, что не надо. это понятно, ошибки дают об этом знать. а как надо?
10 фев 15, 11:25    [17243180]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
seeerg_23
а как надо?

Надо поставить алиас в правильное место.
А не туда, куда вам подсказывает интуиция
10 фев 15, 11:26    [17243196]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
seeerg_23
то, что не надо. это понятно, ошибки дают об этом знать. а как надо?

Ваши первые посты по MS SQL были в далёком 2006 году. Неужели весь синтаксис с тех пор забыли? :)
10 фев 15, 11:52    [17243436]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
seeerg_23
в некоторых полях одной строки данные перечисляются и выводятся через ",", при этом данные разные. то есть операторы LIKE %% и Replace не подходят. это информация об IPадресе ПК. я вычитываю и иногда получаю адреса IPv4 и IPv6,

например,
PC1 - 192.168.10.10, fe80::7c94:d03b:7438:3980;
PC2 - 192.168.10.121, fe80::50f9:a111:394c:2c44;

Нужно оставить только адрес IPv4. Но IPv6 начинается у всех на fe80.. подскажите, как это осуществить?


+ если религия позволяет, то так

with t0(d) as
(
	select N'PC1 - 192.168.10.10, fe80::7c94:d03b:7438:3980;' union all
	select N'PC2 - 192.168.10.121, fe80::50f9:a111:394c:2c44;'
)
select
	t0.*,
	ipv4t.value as ipv4
from
	t0
		cross apply
	ext.Regex_Match(d, N'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' ,null) as ipv4t;





К сообщению приложен файл. Размер - 13Kb
10 фев 15, 12:09    [17243584]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
churupaha
...если религия позволяет, то так...

ну так чтобы ему религия позволила вы и скрипт на функцию напишите
ext.Regex_Match(d, N'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' ,null) as ipv4t;
10 фев 15, 12:27    [17243702]     Ответить | Цитировать Сообщить модератору
 Re: убрать лишнее в колонке строки  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
LexusR
churupaha
...если религия позволяет, то так...

ну так чтобы ему религия позволила вы и скрипт на функцию напишите
ext.Regex_Match(d, N'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' ,null) as ipv4t;


Примерно так 17118161
10 фев 15, 12:38    [17243792]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить