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

Откуда:
Сообщений: 8
Добрый день, All!

Подскажите пожалуйста, как можно лучшим образом решить следующую задачу:
В столбце таблицы A хранятся маски, подходящие для оператора like. К примеру: a_cde%
В столбце таблицы B также хранятся маски подходящие для оператора like. К примеру: ab_def%
Нужно собрать все записи, которые подходят друг другу, учитывая, что в обеих строках маски.
К примеру, записи выше подходят друг другу.

Я делаю это посимвольным сравнением, и на больших объемах данных всё происходит крайне медленно.
17 июл 14, 16:27    [16319600]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а чем like не устроил то ?
17 июл 14, 16:28    [16319607]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Maxx
а чем like не устроил то ?
Наверно, тем, что каждая маска задаёт множество бесконечного количества строк, которые ей удовлетворяют.
А надо доказать, что множества строк, порождённые двумя разными масками, равны друг другу.

johnnyg, лет через 30 напишите здесь, получилось у Вас что-нибудь или нет.
Предсказываю, что напишете "не получилось".
17 июл 14, 16:36    [16319666]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
johnnyg
В столбце таблицы A хранятся маски, подходящие для оператора like. К примеру: a_cde%
В столбце таблицы B также хранятся маски подходящие для оператора like. К примеру: ab_def%
Нужно собрать все записи, которые подходят друг другу, учитывая, что в обеих строках маски.
К примеру, записи выше подходят друг другу.

поясните, почему вы считаете что эти две маски подходят друг другу
строка "afcde", например, подходит первой маске, но не подходит второй
17 июл 14, 16:39    [16319689]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap
Предсказываю, что напишете "не получилось".

ну се ты так сразу :) Вдруг задача легче ?
17 июл 14, 16:40    [16319691]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Хотя, если формально написать алгоритм обработки строки каждой маской,
и они совпадут, то, значит, и сами маски равны.
17 июл 14, 16:42    [16319713]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Shakill
johnnyg
В столбце таблицы A хранятся маски, подходящие для оператора like. К примеру: a_cde%
В столбце таблицы B также хранятся маски подходящие для оператора like. К примеру: ab_def%
Нужно собрать все записи, которые подходят друг другу, учитывая, что в обеих строках маски.
К примеру, записи выше подходят друг другу.

поясните, почему вы считаете что эти две маски подходят друг другу
строка "afcde", например, подходит первой маске, но не подходит второй
Да. Пример, кстати, неправильный. Или имелось в виду что-то не то...
17 июл 14, 16:43    [16319728]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
johnnyg
Member

Откуда:
Сообщений: 8
Возможно не верно объяснил.
Мне нужно найти строки в таблицах A и B которые подходят друг другу учитывая, что в обеих строках маски.
В примере:
строка 1: a_cde%
строка 2: ab_def%
Подходят друг другу, т.к.:
на позиции 2 первой строки стоит символ '_', следовательно в строке 2 на этой позиции может быть что угодно.
на позиции 3 второй строки стоит символ '_', следовательно в строке 1 на этой позиции может быть что угодно.
на позиции 6 первой строки стоит символ '%', следовательно в строке 2 на этой позиции может быть что угодно или ничего не быть.
на позиции 7 второй строки стоит символ '%', следовательно в строке 1 на этой позиции может быть что угодно или ничего не быть.

Like не подходит. т.к. такой пример вернет нам в обоих выборках пустоту.
select 'a_cde%' as Q into #A
select 'ab_def%' as W into #B

select * from #A, #B  where #A.Q like #B.W 
select * from #A, #B where #B.W like #A.Q
17 июл 14, 17:01    [16319839]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
johnnyg, но в строке 1 на третьей позиции стоит 'c', следовательно, во второй строке тоже должно быть 'c', а там '_'. не подходит
17 июл 14, 17:13    [16319911]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Shakill
johnnyg, но в строке 1 на третьей позиции стоит 'c', следовательно, во второй строке тоже должно быть 'c', а там '_'. не подходит
Видно, он и не думает рассматривать обычные символы как часть маски?
Иначе вообще непонятно.
17 июл 14, 17:15    [16319929]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
johnnyg
Member

Откуда:
Сообщений: 8
Shakill
johnnyg, но в строке 1 на третьей позиции стоит 'c', следовательно, во второй строке тоже должно быть 'c', а там '_'. не подходит


Так я же пишу: на позиции 3 второй строки стоит символ '_', следовательно в строке 1 на этой позиции может быть что угодно.

У меня появилась идея это реализовать только посимвольным сравнением:
Идем по обеим строкам:
Если в первой строке на данной позиции '_' или во второй на данной позиции '_', то переходим к следующему символу, если нет то сравниваем символы в строках на данной позиции.
Ну для '%' понятно.

Вопрос в том, можно ли это реализовать как-то по другому, кроме посимвольного сравнения?
17 июл 14, 17:18    [16319952]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9169
Если предположить, что каждое знакоместо может быть представлено, скажем, 128 символами и длина маски не более 10,
то получим вполне компактный "шумовой" массив данных, на котором можно тестировать маски.
17 июл 14, 17:19    [16319962]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
johnnyg
Shakill
johnnyg, но в строке 1 на третьей позиции стоит 'c', следовательно, во второй строке тоже должно быть 'c', а там '_'. не подходит


Так я же пишу: на позиции 3 второй строки стоит символ '_', следовательно в строке 1 на этой позиции может быть что угодно.
это проверка применимости второй маски к первой строке, а где проверка применимости первой маски ко второй? или применять можно как попало?


johnnyg
У меня появилась идея это реализовать только посимвольным сравнением:
Идем по обеим строкам:
Если в первой строке на данной позиции '_' или во второй на данной позиции '_', то переходим к следующему символу, если нет то сравниваем символы в строках на данной позиции.
Ну для '%' понятно.

интересно. строки 'привет%' и '%пока' будут подходить или нет и почему? и как вы собираетесь их посимвольно сравнивать?
17 июл 14, 17:24    [16319986]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9169
Маски подходят, если хотя бы одна из них является множеством для остальных.
17 июл 14, 17:27    [16320005]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9169
Владислав Колосов
Если предположить, что каждое знакоместо может быть представлено, скажем, 128 символами и длина маски не более 10,
то получим вполне компактный "шумовой" массив данных, на котором можно тестировать маски.


Чет я загнул, это ж 128 в 10 степени.
17 июл 14, 17:29    [16320016]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Владислав Колосов
Маски подходят, если хотя бы одна из них является множеством для остальных.
не понял, поясните. в исходном примере ТС две маски, которые описывают два разных, частично пересекающихся множества строк.
17 июл 14, 17:33    [16320036]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
johnnyg
Member

Откуда:
Сообщений: 8
Shakill
интересно. строки 'привет%' и '%пока' будут подходить или нет и почему? и как вы собираетесь их посимвольно сравнивать?

Прощу прощения, небольшое уточнение: % может быть только в конце маски.

Shakill
Владислав Колосов
Маски подходят, если хотя бы одна из них является множеством для остальных.
не понял, поясните. в исходном примере ТС две маски, которые описывают два разных, частично пересекающихся множества строк.

Нам нужно собрать только те строки, из обеих таблиц которые описывают два разных, частично пересекающихся множества строк.
Если их множества не пересекаются - не брать.
17 июл 14, 17:39    [16320063]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
johnnyg
частично пересекающихся

глобал вапрос - условие етой частичности у вас у самого сформированно как-то ?
17 июл 14, 17:42    [16320081]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
johnnyg
Member

Откуда:
Сообщений: 8
Maxx
johnnyg
частично пересекающихся

глобал вапрос - условие етой частичности у вас у самого сформированно как-то ?

Прощу прощения - уточнение: частично и полностью пересекающиеся.
17 июл 14, 18:00    [16320171]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
johnnyg
Прощу прощения - уточнение: частично и полностью пересекающиеся.


написали бы сразу - выбрать пары масок из таблиц A и B, для которых найдется хотя бы одна строка, подходящая обеим. быстрого решения для больших таблиц тут не вижу
17 июл 14, 18:11    [16320214]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9169
Лучше CLR ничего не приходит в голову...
17 июл 14, 18:31    [16320286]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
johnnyg

Я делаю это посимвольным сравнением, и на больших объемах данных всё происходит крайне медленно.
Что вы называете большими объемами?
Какую скорость обработки вы ожидаете?
18 июл 14, 01:09    [16322137]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
johnnyg
Member

Откуда:
Сообщений: 8
Владислав Колосов
Лучше CLR ничего не приходит в голову...

Если использовать CLR получится ли быстрее посимвольного сравнения в SQL?

Mind
johnnyg
Я делаю это посимвольным сравнением, и на больших объемах данных всё происходит крайне медленно.
Что вы называете большими объемами?
Какую скорость обработки вы ожидаете?

По 100млн строк в каждой таблице.
Любому ускорению от 5% по сравнению с посимвольным сравнением буду рад.
18 июл 14, 14:24    [16325196]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
johnnyg
По 100млн строк в каждой таблице.
Любому ускорению от 5% по сравнению с посимвольным сравнением буду рад.

у вас два полных скана, некий расход памяти и проверка (100млн * 100млн ) пар.

если маски повторяются в пределах одной таблицы, можно дистинктом уменьшить количество проверяемых пар, но получим затраты на дистинкт; можно отсеять обратные друг другу комбинации; можно сразу выбрать одинаковые маски из A и B как подходящие, можно сразу выбрать случаи когда одна маска покрывает другую и т.д.

вместо посимвольного сравнения можно перейти к самой сути вашей задачи http://stackoverflow.com/questions/2966865/intersection-of-two-regular-expressions , но боюсь, что будет еще медленнее.

и проверьте где у вас медленное звено
18 июл 14, 14:54    [16325498]     Ответить | Цитировать Сообщить модератору
 Re: like когда в результирующей строке тоже маска  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9169
автор
Если использовать CLR получится ли быстрее посимвольного сравнения в SQL?


Думаю, что на несколько порядков при том же посимвольном алгоритме (не знаю реализации).
Вам же требуется 10^16 - 10^8 сравнений...
18 июл 14, 15:50    [16325941]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить