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

Откуда:
Сообщений: 79
Стоит такая задача: в текстовом поле встречается текст [prot]. Именно так, в квадратных скобках. мне же необходимо отобрать строки с таким текстовым полем, которое содержит какие-то символы, присовокупленные к этому тексту, например, [prot]_1 или tmp_[prot]...
Я пока новичек в sql и что-то не очень получается((
Вот, пока что попробовала сделать:
select idc,idf,tip,name,prizn from a_kon_sym f where auto_edit like '%%+%prot%'
но кажется, отбирается не всё. Может быть, кто-нибудь подскажет, как можно сделать?
Заранее благодарна.
3 июн 13, 17:15    [14385207]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
klara1
Member

Откуда:
Сообщений: 79
select idc,idf,tip,name,prizn from a_kon_sym where auto_edit like '%%+%prot%'

То есть вот так :)
3 июн 13, 17:16    [14385226]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5133
like '%[prot]%'
3 июн 13, 17:17    [14385237]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
klara1
select idc,idf,tip,name,prizn from a_kon_sym where auto_edit like '%%+%prot%'

То есть вот так :)

так он у вас ещё и + ищет. Просто
LIKE '%[prot]%' 
3 июн 13, 17:24    [14385290]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
iap
Member

Откуда: Москва
Сообщений: 47006
Александр52
like '%[prot]%'
Ну что Вы, коллега! Как же так можно!
like '%[[]prot]%'
3 июн 13, 17:25    [14385293]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Glory
Member

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


Сообщение было отредактировано: 3 июн 13, 17:26
3 июн 13, 17:26    [14385299]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
iap
Александр52
like '%[prot]%'
Ну что Вы, коллега! Как же так можно!
like '%[[]prot]%'


:P Даж стыдно стало:)
3 июн 13, 17:26    [14385300]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
iap
Member

Откуда: Москва
Сообщений: 47006
Сергей Викт.
klara1
select idc,idf,tip,name,prizn from a_kon_sym where auto_edit like '%%+%prot%'

То есть вот так :)

так он у вас ещё и + ищет. Просто
LIKE '%[prot]%' 
Значит, годится строка 'p'? Или, всё-таки, должно быть слово prot в квадратных скобках?
3 июн 13, 17:26    [14385305]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
invm
Member

Откуда: Москва
Сообщений: 9429
declare @s1 varchar(30) = '1[prot]2', @s2 varchar(30) = '1[p]2';

select '@s1' where @s1 like '%[[]prot]%';
select '@s1' where @s1 like '%[prot]%';

select '@s2' where @s2 like '%[[]prot]%';
select '@s2' where @s2 like '%[prot]%';
3 июн 13, 17:27    [14385312]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
iap
Сергей Викт.
пропущено...

так он у вас ещё и + ищет. Просто
LIKE '%[prot]%' 
Значит, годится строка 'p'? Или, всё-таки, должно быть слово prot в квадратных скобках?

я уже написал выше, что лоханулся:)
конечно должно быть как вы написали выше.
3 июн 13, 17:29    [14385322]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
iap
Member

Откуда: Москва
Сообщений: 47006
А вот если на месте теперешней левой квадратной скобки
мы хотим видеть или левую или правую, то я не знаю решения с помощью одного LIKE

Из-за того, что первая же правая квадратная скобка
после первой левой квадратной скобки рассматривается как "конец диапазона".
А следующая правая скобка - это просто символ, обязательный на данном месте (задана уже вне диапазона).
3 июн 13, 17:33    [14385351]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5133
iap, оказывается я не знал, теперь осведомлен, спасибо! :)
3 июн 13, 17:33    [14385356]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
like '%![prot!]%' escape '!'
3 июн 13, 17:34    [14385364]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
iap
Member

Откуда: Москва
Сообщений: 47006
Александр52
iap, оказывается я не знал, теперь осведомлен, спасибо! :)
Точно так же и другие спецсимволы (%_) могут задаваться в числе заданного множества символов внутри квадратных скобок.


Что-то я в предыдущем сообщении неправильно употребил слово "диапазон".
Правильнее "множество", наверно. В общем, то, что между квадратными скобками.
3 июн 13, 17:36    [14385380]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iap
А вот если на месте теперешней левой квадратной скобки
мы хотим видеть или левую или правую, то я не знаю решения с помощью одного LIKE

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 a like '%[![!]]prot!]%' escape '!'
3 июн 13, 17:37    [14385387]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Гость333
like '%![prot!]%' escape '!'

Красиво!! Правда.. В закладки) Ни разу не использовал, а оказывается весьма полезная вещь!!!
3 июн 13, 17:38    [14385390]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
iap
Member

Откуда: Москва
Сообщений: 47006
Гость333
'%[![!]]prot!]%' escape '!'
Вот! Подозревал, но лень было проверить.
Однако, мне не нравится, что ESCAPE нельзя использовать в PATINDEX()! :))
3 июн 13, 17:41    [14385417]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iap
Однако, мне не нравится, что ESCAPE нельзя использовать в PATINDEX()! :))

Кстати, да, какое-то непонятное упущение :)
3 июн 13, 17:43    [14385424]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Ennor Tiegael
Member

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

Вы б сначала запустили, прежде чем так разливаться.


Искейп - да, безусловно. Но мне кажется, в один лайк здесь не сделать в принципе. Если нужно по одному непробельному символу слева ИЛИ справа, то кроме OR ничего не взлетит. Разумеется, не считая извратов с UNION ALL и последующим having count(*) = 2.
3 июн 13, 17:45    [14385439]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Ennor Tiegael
мне кажется, в один лайк здесь не сделать в принципе.

"Здесь" — это где, в какой задаче? :)
3 июн 13, 17:48    [14385463]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Ennor Tiegael
Сергей Викт.,

Вы б сначала запустили, прежде чем так разливаться.


Искейп - да, безусловно. Но мне кажется, в один лайк здесь не сделать в принципе. Если нужно по одному непробельному символу слева ИЛИ справа, то кроме OR ничего не взлетит. Разумеется, не считая извратов с UNION ALL и последующим having count(*) = 2.


where a like '%[![]prot!]%' escape '!' 

Мне кажется это работает, нет? По крайней мере я запустил, покрутил разные скобочки, всё нормуль :)
3 июн 13, 17:49    [14385470]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

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

where a like '%[![]prot!]%' escape '!' 

Мне кажется это работает, нет? По крайней мере я запустил, покрутил разные скобочки, всё нормуль :)

А вариант
like '%![prot!]%' escape '!'
на каких-то данных работает неправильно?
3 июн 13, 17:52    [14385488]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

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


А так нельзя или что???
3 июн 13, 17:54    [14385503]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Гость333
Сергей Викт.
where a like '%[![]prot!]%' escape '!' 

Мне кажется это работает, нет? По крайней мере я запустил, покрутил разные скобочки, всё нормуль :)

А вариант
like '%![prot!]%' escape '!'
на каких-то данных работает неправильно?

Вроде правильно:)
3 июн 13, 17:55    [14385504]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

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


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

нельзя) уже нашёл, где это не работает)))
3 июн 13, 17:55    [14385510]     Ответить | Цитировать Сообщить модератору
 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

Откуда:
Сообщений: 3280
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

Откуда:
Сообщений: 3280
Эээ, все чуть хуже:
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

Откуда:
Сообщений: 3280
Гость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

Откуда:
Сообщений: 3280
Гость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

Откуда: Москва
Сообщений: 9429
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

Откуда:
Сообщений: 3280
Гость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]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

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

А вот такая конструкция у вас допустима? Синтаксически тут всё правильно
update [prot] set x = [prot].x + 1
4 июн 13, 12:21    [14388208]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
iap
Member

Откуда: Москва
Сообщений: 47006
А зачем вообще INTO, мне всегда спросить хочется.
4 июн 13, 12:22    [14388213]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

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

ЭТо уже вопрос к ТС
4 июн 13, 12:23    [14388216]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
klara1
Member

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

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

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

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

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

Работает, спасибо, буду тестировать дальше...
4 июн 13, 12:48    [14388355]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
iap
Member

Откуда: Москва
Сообщений: 47006
klara1
iap,

формулы пишет другой разработчик, мне нужно их проверить
Но INTO может быть, а может не быть - это же не ошибка!
А Вы ничего об этом не говорите.

В общем, я думаю, что поскольку индексы всё равно идут лесом, то сначала надо причесать
проверяемую строку к некоторому каноническому виду,
а уж потом проверять наличие. отсутствие в ней неких "ключевых слов".

Например, все разделители заменить на пробелы,
все множественные пробелы заменить на единичные пробелы,
слева и справа к строке добавить по одному разделителю
для исключения влияния начала и конца строки и т.п.

И, да! Вас не затруднит в дальнейшем пользоваться тегом [SRС]?
4 июн 13, 12:54    [14388408]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
klara1
iap,

формулы пишет другой разработчик, мне нужно их проверить

А каким образом он организует эти данные? Может быть правильнее было бы на его стороне корректно формировать строку запроса? Т.к. соглашусь с iap, есть достаточно много ситуаций с разным использованием инструкции.

Например
INSERT INTO tbl

INSERT tbl

INSERT tbl
SELECT a,b,c

INSERT INTO tbl
VALUES(a,b,c),(a,c,b)
4 июн 13, 12:59    [14388464]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
klara1
Member

Откуда:
Сообщений: 79
всё работает, вот что получилось с вашими советами:
USE [basa]

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 '\'
) AND t.auto_edit not like '%INSERT INTO \[prot\](%' escape'\'


только одна проблема. Есть поля, где в auto_edit есть такая формула:
insert into [PROT]
SELECT...

и т.д.
То есть слово Select начинается с новой строки и как бы после [PROT] без пробела... Поэтому строки с такой формулой в графе auto_edit отбираются в запросе, а их не надо.
Как бы заложить условие, что если после [PROT] не пробел, а нажали enter и пишут с новой строки, чтобы эта строка тоже не выводилась?
5 июн 13, 17:07    [14396019]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
klara1
всё работает, вот что получилось с вашими советами:
USE [basa]

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 '\'
) AND t.auto_edit not like '%INSERT INTO \[prot\](%' escape'\'


только одна проблема. Есть поля, где в auto_edit есть такая формула:
insert into [PROT]
SELECT...

и т.д.
То есть слово Select начинается с новой строки и как бы после [PROT] без пробела... Поэтому строки с такой формулой в графе auto_edit отбираются в запросе, а их не надо.
Как бы заложить условие, что если после [PROT] не пробел, а нажали enter и пишут с новой строки, чтобы эта строка тоже не выводилась?

Вроде переход на новую строку хранится в строке в виде двух последовательных пробелов. Или я ошибаюсь?
5 июн 13, 17:16    [14396079]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
А ещё лучше приведите, пожалуйста, реальный пример:) Так проще будет придумать
5 июн 13, 17:16    [14396086]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сергей Викт.
Вроде переход на новую строку хранится в строке в виде двух последовательных пробелов. Или я ошибаюсь?

Вы ошибаетесь.
5 июн 13, 17:26    [14396135]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Гость333
Сергей Викт.
Вроде переход на новую строку хранится в строке в виде двух последовательных пробелов. Или я ошибаюсь?

Вы ошибаетесь.

хм. Просто сделал мини запрос и получил 2 пробела

SELECT 'asd
asasdf'

Выводит в одном столбце, копирую в блокнот - 2 пробела))) Я для чего собственно спросил, как в t-SQL при разборе найти переход на новую строчку?:)
5 июн 13, 17:27    [14396144]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

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

DECLARE @str varchar(10);

SET @str = 'asd
asa';

WITH numbers(n) AS
(
  SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL
  SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10
)
SELECT n.n, ASCII(SUBSTRING(@str, n.n, 1)) as code
FROM numbers n
WHERE n.n <= LEN(@str);

n           code
----------- -----------
1           97
2           115
3           100
4           13
5           10
6           97
7           115
8           97
5 июн 13, 17:38    [14396219]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сергей Викт.
Выводит в одном столбце, копирую в блокнот - 2 пробела)))

А теперь выведите result to text и попробуйте найди эти два пробела.
5 июн 13, 17:39    [14396227]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Гость333
Сергей Викт.
Выводит в одном столбце, копирую в блокнот - 2 пробела)))

А теперь выведите result to text и попробуйте найди эти два пробела.

уже проверил) извиняюсь. Просто задача у ТС нетривиальная, интересно :)
5 июн 13, 18:00    [14396345]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сергей Викт.
Просто задача у ТС нетривиальная, интересно :)

Задача ТС называется "синтаксический анализ". С такой постановкой задачи (а точнее, с отсутствием оной постановки) эта задача никогда не будет решена.
5 июн 13, 19:18    [14396643]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Гость333
Сергей Викт.
Просто задача у ТС нетривиальная, интересно :)

Задача ТС называется "синтаксический анализ". С такой постановкой задачи (а точнее, с отсутствием оной постановки) эта задача никогда не будет решена.

Ну почему жею. Очередной "долгострой". По крупинке. Дождёмся ответа от ТС - сделаем ещё и с переходом на другую строку. А потом ещё что-нибудь выплывет. Нормальная ситуация для РФ - работать без ТЗ и не имея четкой постановки.
6 июн 13, 08:40    [14397778]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
iap
Member

Откуда: Москва
Сообщений: 47006
Вообще-то, я, кажется, перечислял что надо сделать,
чтобы сегодняшним требованиям ТС удовлетворить.

Доктор, меня не замечают! ©
6 июн 13, 10:38    [14398382]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сергей Викт.
Гость333
пропущено...

Задача ТС называется "синтаксический анализ". С такой постановкой задачи (а точнее, с отсутствием оной постановки) эта задача никогда не будет решена.

Ну почему жею. Очередной "долгострой". По крупинке. Дождёмся ответа от ТС - сделаем ещё и с переходом на другую строку. А потом ещё что-нибудь выплывет.

Вот, если хотите, выплывает:
use tempdb;
create table[prot](x int);
update[prot]set[prot].x=1; -- всё слитно, без всяких пробелов, тем не менее работает
drop table[prot];


А потом выяснится, что надо комментарии обрабатывать. А потом ещё что-нибудь.
6 июн 13, 11:46    [14398838]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
iap
Member

Откуда: Москва
Сообщений: 47006
Гость333
Вот, если хотите, выплывает:
use tempdb;
create table[prot](x int);
update[prot]set[prot].x=1; -- всё слитно, без всяких пробелов, тем не менее работает
drop table[prot];
Мало того, одним DROPом дропать можно сразу несколько таблиц, перечисленных через запятую!
6 июн 13, 11:55    [14398904]     Ответить | Цитировать Сообщить модератору
 Re: как можно отобрать значения?  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
iap
Гость333
Вот, если хотите, выплывает:
use tempdb;
create table[prot](x int);
update[prot]set[prot].x=1; -- всё слитно, без всяких пробелов, тем не менее работает
drop table[prot];
Мало того, одним DROPом дропать можно сразу несколько таблиц, перечисленных через запятую!

да и update SET через запятую может быть много полей указано и с пробелами после запятой, и без оных. Поэтому я и сказал, что задача нетривиальная)) Ну или просто хз какая.
6 июн 13, 12:09    [14399030]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3      [все]
Все форумы / Microsoft SQL Server Ответить