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

Откуда:
Сообщений: 34
Добрый день всем.
Прошу совета в таком вопросе.

Есть набор символов, например: а,б,в,г,д
Нужно выбрать из таблицы строки, содержащие по меньшей мере два РАЗНЫХ символа из этого набора
То есть простой
like '%[абвгд]%[абвгд]%' 
не подойдет, т.к. например из двух строк "рама","еда" он вернет обе, а нужно, чтобы только "еда"

То есть, как я это себе представляю, нужно какое то последовательное сравнение строки с этим набором символов - в "рама" ищется любой из "абвгд", затем любой из "бвгд" и т. д., но как это реализовать - не пойму.
27 апр 18, 21:19    [21375394]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать строки, содержащие минимум два символа из набора  [new]
invm
Member

Откуда: Москва
Сообщений: 9351
declare @t table (s varchar(100));
insert into @t
values
 ('рама'), ('еда');

declare @p table (c char(1) primary key);
insert into @p
values
 ('а'), ('б'), ('в'), ('г'), ('д');
 
select
 t.s
from
 @t t
where
 exists(select * from @p where charindex(c, t.s) > 0 having count(*) > 1);
27 апр 18, 22:59    [21375612]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать строки, содержащие минимум два символа из набора  [new]
Гордон Шамуэй
Member

Откуда:
Сообщений: 34
invm
declare @t table (s varchar(100));
insert into @t
values
 ('рама'), ('еда');

declare @p table (c char(1) primary key);
insert into @p
values
 ('а'), ('б'), ('в'), ('г'), ('д');
 
select
 t.s
from
 @t t
where
 exists(select * from @p where charindex(c, t.s) > 0 having count(*) > 1);


Спасибо
Я делал примерно так же:

WITH CTE AS(
SELECT 'а' AS letter
UNION
SELECT 'б' 
UNION
SELECT 'в' 
UNION
SELECT 'г' 
UNION
SELECT 'д' 
)

SELECT column FROM Table1, CTE
WHERE column like '%'+letter+'%' 
.GROUP BY column 
HAVING COUNT(*)>1 


Может быть есть какое-то решение через парсинг, чтобы не городить вторую таблицу?
28 апр 18, 00:33    [21375797]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать строки, содержащие минимум два символа из набора  [new]
aleks222
Member

Откуда:
Сообщений: 985
declare @t table (s varchar(100));
insert into @t
values
 ('рама'), ('еда');

declare @n table (n int);
insert into @n
values
 (1), (2), (3), (4), (5), (6);


 with x as ( select t.s, c = substring(s, n.n, 1) from @t as t inner join @n as n on n.n <= len(s) )
    , y as ( select * from x where charindex( c, 'абвгд' ) > 0 )
  select * from @t as t where exists( select * from y inner join y as y1 on y1.s = y.s and y1.c <> y.c where y.s = t.s )
28 апр 18, 06:34    [21375884]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить