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

Откуда: Москва
Сообщений: 888
Сергей Викт.
Сергей Викт.
like '%[[][p][r][o][t]]%'


А так нельзя или что???

нельзя) уже нашёл, где это не работает)))


like '%[[]'+'[p]'+'[r]'+'[o]'+'[t]]%' 
))))
Во, )) красотень:)
3 июн 13, 17:59    [14385526]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сергей Викт.
like '%[[]'+'[p]'+'[r]'+'[o]'+'[t]]%' 
))))
Во, )) красотень:)

И чем это отличается от придуманного и тут же забракованного вами варианта
like '%[[][p][r][o][t]]%'
?
3 июн 13, 18:28    [14385691]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
klara1
мне же необходимо отобрать строки с таким текстовым полем, которое содержит какие-то символы, присовокупленные к этому тексту, например, [prot]_1 или tmp_[prot]...
Вот из-за этого оно все и не взлетает. Только если таким читом:
with cte(a) as (select '[prot]' union all select 'a[prot]b' union all select 'a]prot]b' union all select 'a]prot[b')
select a
from cte
where '1' + a like '%_\[prot\]_%' escape '\';
но это на больших объемах все положит.
3 июн 13, 18:41    [14385735]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
Эээ, все чуть хуже:
where '1' + a + '1' like '%_\[prot\]_%' escape '\';
3 июн 13, 18:43    [14385744]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Ennor Tiegael
Эээ, все чуть хуже:
where '1' + a + '1' like '%_\[prot\]_%' escape '\';

А почему бы не так?
where a like '%\[prot\]%' escape '\' and len(a) > len('[prot]');
3 июн 13, 18:49    [14385770]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
Гость333
Ennor Tiegael
Эээ, все чуть хуже:
where '1' + a + '1' like '%_\[prot\]_%' escape '\';

А почему бы не так?
where a like '%\[prot\]%' escape '\' and len(a) > len('[prot]');
Потому что
'[prot] b'
попадает, а не должно.
where '1' + a + '1' like '%[^ ]\[prot\][^ ]%' escape '\';
3 июн 13, 19:00    [14385799]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Ennor Tiegael
Потому что
'[prot] b'
попадает, а не должно.

А можно огласить условие задачи, которую вы решаете??
3 июн 13, 19:24    [14385894]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
Гость333,

А вы внимательный :) Я ж уже цитировал это место из ТСа, чуть выше. Ну ладно, повторю:
klara1
мне же необходимо отобрать строки с таким текстовым полем, которое содержит какие-то символы, присовокупленные к этому тексту, например, [prot]_1 или tmp_[prot]...
4 июн 13, 04:30    [14386880]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Ennor Tiegael
Гость333,

А вы внимательный :) Я ж уже цитировал это место из ТСа, чуть выше. Ну ладно, повторю:
klara1
мне же необходимо отобрать строки с таким текстовым полем, которое содержит какие-то символы, присовокупленные к этому тексту, например, [prot]_1 или tmp_[prot]...

То есть "пробел бэ" не являются "символами, присовокупленными к тексту"? Очень странно, конечно :-)
4 июн 13, 09:27    [14387188]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
klara1
Member

Откуда:
Сообщений: 79
Попробовала
'%[![!]]prot!]%' escape '!'
и все другие варианты с escape '!'

выходят все записи, где есть [PROT]
а нужно [prot]1 или 1_[prot] или допустим [prot]_yttr
4 июн 13, 09:32    [14387218]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
klara1
Попробовала
'%[![!]]prot!]%' escape '!'
и все другие варианты с escape '!'

выходят все записи, где есть [PROT]
а нужно [prot]1 или 1_[prot] или допустим [prot]_yttr

Попробуйте так.

like '%\[prot\]%' escape '\'
4 июн 13, 09:42    [14387283]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
invm
Member

Откуда: Москва
Сообщений: 9404
klara1
а нужно [prot]1 или 1_[prot] или допустим [prot]_yttr
somefield like '%_[[]prot]' or somefield like '[[]prot]_%'
4 июн 13, 09:54    [14387363]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
klara1
Member

Откуда:
Сообщений: 79
Не хочешь. Может быть, не тот синтаксис? Я делаю в sql 2005... Причём отбираются записи, содержащие [prot] :(
4 июн 13, 09:58    [14387392]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
klara1
Не хочешь. Может быть, не тот синтаксис? Я делаю в sql 2005... Причём отбираются записи, содержащие [prot] :(

with cte(a) as (
select '[prot]' 
union all 
select 'a[prot]b' 
union all 
select 'a]prot]b' 
union all 
select 'a]prot[b' 
union all 
select '1_[prot]' 
union all 
select '[prot]_yttr'
union all
select '[prot]1'
)
select a
from cte
where a like '%\[prot\]%' escape '\'


Как не работает? Выбирает то, что вам нужно, разве нет???
4 июн 13, 10:04    [14387440]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
klara1
Member

Откуда:
Сообщений: 79
Да, если известны, какие варианты символов могут быть. Если, например, символ [PROT]_yttr, то отбирает. А если asdf_[PROT] - уже не видит. Предусмотреть все символы невозможно в моём случае, они могут встретиться абсолютно любые.
4 июн 13, 10:14    [14387507]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
klara1
Да, если известны, какие варианты символов могут быть. Если, например, символ [PROT]_yttr, то отбирает. А если asdf_[PROT] - уже не видит. Предусмотреть все символы невозможно в моём случае, они могут встретиться абсолютно любые.

with cte(a) as (
select '[prot]' 
union all 
select 'a[prot]b' 
union all 
select 'a]prot]b' 
union all 
select 'a]prot[b' 
union all 
select '1_[prot]' 
union all 
select '[prot]_yttr'
union all
select '[prot]1'
union all
select 'asdf_[PROT]'
)
select a
from cte
where a like '%\[prot\]%' escape '\'

Результат:
[prot]
a[prot]b
1_[prot]
[prot]_yttr
[prot]1
asdf_[PROT]


Разве это неправильный результат??? Либо я вас неправильно понимаю.
4 июн 13, 10:26    [14387574]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
Гость333
То есть "пробел бэ" не являются "символами, присовокупленными к тексту"? Очень странно, конечно :-)
С точки зрения ТСа, видимо, да. Достаточно посмотреть на примеры.


klara1,

Вот так, наверное, будет лучше всего:
declare @Masks table (
	Mask nvarchar(20) primary key
);

insert into @Masks (Mask)
values
	('%[^ ]\[prot\]%'),
	('%\[prot\][^ ]%');

select *
from dbo.SomeTable t
where exists (
	select 0 from @Masks ms where t.Field like ms.Mask escape '\'
	);
Имхо, лучшая обертка для OR'а из всех возможных.
4 июн 13, 10:28    [14387582]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
klara1
Member

Откуда:
Сообщений: 79
В таблице есть длинное текстовое поле с определенной формулой. Почти всегда формула содержит переменную [prot] (именно слово prot в квадратных скобках). Таблица называется, наприемр, tabl. Поле с формулой называется pole.
Но иногда к переменной [prot] присоединены символы без пробелов, перед или после, а этого быть не должно. Нужно их отслеживать и исправлять. ТО есть надо отобрать те строки таблицы, у которых в поле pole есть подобные записи, например, [prot]9 или tmp_[prot].
4 июн 13, 10:32    [14387624]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
klara1
В таблице есть длинное текстовое поле с определенной формулой. Почти всегда формула содержит переменную [prot] (именно слово prot в квадратных скобках). Таблица называется, наприемр, tabl. Поле с формулой называется pole.
Но иногда к переменной [prot] присоединены символы без пробелов, перед или после, а этого быть не должно. Нужно их отслеживать и исправлять. ТО есть надо отобрать те строки таблицы, у которых в поле pole есть подобные записи, например, [prot]9 или tmp_[prot].

А можно скрипт создания таблицы и несколько реальных примеров заполнения данными?
4 июн 13, 10:33    [14387640]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Glory
Member

Откуда:
Сообщений: 104760
klara1
ТО есть надо отобрать те строки таблицы, у которых в поле pole есть подобные записи, например, [prot]9 или tmp_[prot].

И что ни один из предложенных вариантов вам не подошел ?
4 июн 13, 10:34    [14387645]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
klara1
Member

Откуда:
Сообщений: 79
Сергей Викт.,

CREATE TABLE [frm_control] (
[idf] [smallint] NOT NULL ,
[idc] [smallint] NULL ,
[tip] [tinyint] NULL ,
[auto_edit] [text] COLLATE database_default NULL ,
[drob] [int] NULL
)
GO

полде idf - обычный номер п/п
необходимо получить данные из поля auto_edit

вот пример правильного текста в поле auto_edit:

insert into [PROT] (ko,idc,spec,gr_st,lft,rt,delta)
select ko,20040,s1,st,zn_1,zn_2,zn_1-zn_2 from a_kon1
а это пример неправильного:
update tmp_[PROT] set s196=t2.kol from tmp_[PROT] t1
может быть также так:

update [PROT]_22 set s196=t2.kol from [PROT]_22 t1

нужно получить список этих строк с неправильной формулой, хотя бы их номеров (поле idf)
лучше, конечно, ещё список неправильных символов, но это не обязательно.
Например в таком виде
idf
2
4
или (оптимально)
idf auto_edit
2 tmp_[prot]

и т,д....
4 июн 13, 10:59    [14387785]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
klara1
Member

Откуда:
Сообщений: 79
Ennor Tiegael,

Спасибо огромное, то, что надо! Кажется, всё получилось, сейчас протестирую ещё...
4 июн 13, 11:13    [14387841]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
klara1
Member

Откуда:
Сообщений: 79
Ennor Tiegael,

USE [oe_1pred12]

declare @Masks table (
Mask nvarchar(20) primary key
);

insert into @Masks (Mask)
values
('%[^ ]\[prot\]%')
insert into @Masks (Mask)
values ('%\[prot\][^ ]%')



select *
from dbo.frm_control t
where exists (
select 0 from @Masks ms where t.auto_edit like ms.Mask escape '\'
);


всё замечательно работает. Но теперь такая заморочка: надо, чтобы в этом поле отбирались все подобные ошибки, исключая словосочетание
INSERT INTO [PROT](
То есть после [prot] сразу может стоять скобка, если перед ним словосочетание INSERT INTO
И это не должно отбираться. А остальные значения должны отбираться по-прежнему.
В эту процедуру можно такое условие поставить? :)
4 июн 13, 12:02    [14388095]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
klara1
Ennor Tiegael,
всё замечательно работает. Но теперь такая заморочка: надо, чтобы в этом поле отбирались все подобные ошибки, исключая словосочетание
INSERT INTO [PROT](
То есть после [prot] сразу может стоять скобка, если перед ним словосочетание INSERT INTO
И это не должно отбираться. А остальные значения должны отбираться по-прежнему.
В эту процедуру можно такое условие поставить? :)

select *
from @t t
where exists (
select 0 from @Masks ms where t.a like ms.Mask escape '\'
) [color=red]AND a not like '%INSERT INTO \[prot\](%' escape'\'[/color]

Можно так в принципе
4 июн 13, 12:13    [14388160]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сергей Викт.
AND a not like '%INSERT INTO \[prot\](%' escape'\'

Можно так в принципе
То есть как после INSERT, так и после INTO допустим ровно один пробел, не больше?
4 июн 13, 12:20    [14388197]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить