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

Откуда:
Сообщений: 85
Ребят, слабоват в регулярных выражениях, как при помощи LIKE вытянуть например, чтобы имя состояло из 3 слов? Заранее благодарю!
7 июн 11, 23:02    [10779448]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Like  [new]
qwerty777
Member

Откуда:
Сообщений: 158
like '%[ ]%[ ]%'

http://msdn.microsoft.com/ru-ru/library/ms179859.aspx
7 июн 11, 23:36    [10779588]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Like  [new]
qwerty777
Member

Откуда:
Сообщений: 158
Sorry, это
like '%[ ]%[ ]%'
не катит. Поторопился.

А чтобы найти имя, состоящее из трех слов, лучше посчитать пробелы.
7 июн 11, 23:44    [10779643]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Like  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
deadean, как пример:

DECLARE @tbl TABLE (a varchar(50))
INSERT INTO @tbl(a)
SELECT 'Проверка  1 2' UNION ALL SELECT 'тест тест   тест  ' UNION ALL SELECT 'раз два три четыре'


SELECT * FROM @tbl t
WHERE LEN(REPLACE(REPLACE(t.a,'  ',' '),'  ',' '))=LEN(REPLACE(REPLACE(REPLACE(t.a,'  ',' '),'  ',' '),' ',''))+2
8 июн 11, 00:06    [10779739]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Like  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
   declare @x nvarchar(20)
   set @x = N'1 2 3'
   if @x like '[^ ]%[ ]%[^ ]%[ ]%[^ ]%'
       print '3 space'
   else  
      print 'another count of spaces' 
8 июн 11, 00:22    [10779819]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Like  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Maxx
   declare @x nvarchar(20)
   set @x = N'1 2 3'
   if @x like '[^ ]%[ ]%[^ ]%[ ]%[^ ]'
       print '3 space'
   else  
      print 'another count of spaces' 


вроде так покраще
8 июн 11, 00:50    [10779912]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Like  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Maxx,
set @x = N'1 2 3 4 5'
А если так?
8 июн 11, 01:02    [10779949]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Like  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
kDnZP,

мдя неподходит тада
8 июн 11, 01:05    [10779959]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Like  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Maxx
kDnZP,

мдя неподходит тада


все таки иногда так нехватет регулярных иногда, може чет еще счас выдумаю
8 июн 11, 01:07    [10779964]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Like  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Maxx, ну мне видится либо вариант с реплейсами (при этом долгоиграющие пробелы или другие разделители) реплейсить 16 в 8, 8 в 4, 4 в 2, 2 в 1, 2 в 1 - в зависимости от длины поля. Либо же раскладывать строку по словам, с набором разделителей, считать их количество, а потом при необходимости че-то делать.

Регекспов не хватает, это правда. :)
8 июн 11, 01:13    [10779981]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Like  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
kDnZP
Maxx,
set @x = N'1 2 3 4 5'
А если так?


if @x like '[^ %_%][ ][^ %_%][ ][^ %_%]' 

НО все ето,увы,частный случай...и для решения задачи в целом не подходит :(
8 июн 11, 01:26    [10780015]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Like  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
kDnZP,

или писать свою ф-цю которая вернут количество пробелоа в поле - потом ето анализировать или чет такое, но в лоб - чет придумать не получаеться
Может кому удастся нарисовать рабочую маску под решение задачи, былоб любопытно посмотреть
8 июн 11, 01:28    [10780019]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Like  [new]
Михаил Яковлев
Guest
А если так:

select * from TABLE
where NAME like '%[ ]%[ ]%' and NAME not like '%[ ]%[ ]%[ ]%'
8 июн 11, 09:32    [10780449]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Like  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
Имя из трех слов означает, что в нем всего два пробела

DECLARE @oldlen int

--убираем внешние пробелы
SET @name = rtrim(ltrim(@name))

--убираем внутренние множественные пробелы
SET @oldlen = len(@name)
SET @name = replace(@name, ' ', ' ')

WHILE len(@name) < @oldlen
BEGIN
SET @oldlen = len(@name)
SET @name = replace(@name, ' ', ' ')
END

--убираем все пробелы
SET @name = replace(name, ' ', '')

IF @oldlen - len(@name) = 2 --было два нормализованных пробела, т.е. три слова
бла-бла-бла
ELSE
чего-то еще
IF len(@name) = 2 -- в имени три слова
--
8 июн 11, 11:31    [10781316]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Like  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
DECLARE @Delimiters VARCHAR(100);
SET @Delimiters=' ,.:(){}'+CHAR(10)+CHAR(13)+CHAR(9);

DECLARE @T TABLE(S VARCHAR(1000));
INSERT @T(S)
          SELECT 'hjfdhy   kvtg 66 liughl'
UNION ALL SELECT '1234532, abc% 999'
UNION ALL SELECT ',,,858  999'
UNION ALL SELECT ',,,858  999:000';

SELECT *
FROM @T
WHERE LEFT(@Delimiters,1)+S     LIKE REPLICATE('%['+@Delimiters+']'+'[^'+@Delimiters+']%',3)
  AND LEFT(@Delimiters,1)+S NOT LIKE REPLICATE('%['+@Delimiters+']'+'[^'+@Delimiters+']%',4);
Вот только правую квадратную скобку в качестве разделителя этот SELECT отработает неправильно.
8 июн 11, 12:17    [10781829]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Like  [new]
Strangers
Member [заблокирован]

Откуда: Україна
Сообщений: 2613
если разделитель "пробел", наверное можно так
DECLARE @Delimiters VARCHAR(1);
SET @Delimiters=' '

DECLARE @T TABLE(S VARCHAR(1000));
INSERT @T(S)
          SELECT 'hjfdhy   kvtg 66 liughl'
UNION ALL SELECT ' 1234532, abc% 999 '
UNION ALL SELECT '  ,,,858  999'
UNION ALL SELECT ',,,858  999:000';

SELECT *
FROM @T
WHERE LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(S,@Delimiters+@Delimiters,'@'+@Delimiters),@Delimiters + '@' + @Delimiters,''),'@'+@Delimiters,@Delimiters))) like '%'+ @Delimiters + '%' + @Delimiters +'%'
8 июн 11, 16:48    [10784523]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить