Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / like когда в результирующей строке тоже маска / 25 сообщений из 26, страница 1 из 2
17.07.2014, 16:27
    #38699383
johnnyg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
Добрый день, All!

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

Я делаю это посимвольным сравнением, и на больших объемах данных всё происходит крайне медленно.
...
Рейтинг: 0 / 0
17.07.2014, 16:28
    #38699385
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
а чем like не устроил то ?
...
Рейтинг: 0 / 0
17.07.2014, 16:36
    #38699409
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
Maxxа чем like не устроил то ?Наверно, тем, что каждая маска задаёт множество бесконечного количества строк, которые ей удовлетворяют.
А надо доказать, что множества строк, порождённые двумя разными масками, равны друг другу.

johnnyg, лет через 30 напишите здесь, получилось у Вас что-нибудь или нет.
Предсказываю, что напишете "не получилось".
...
Рейтинг: 0 / 0
17.07.2014, 16:39
    #38699414
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
johnnygВ столбце таблицы A хранятся маски, подходящие для оператора like. К примеру: a_cde%
В столбце таблицы B также хранятся маски подходящие для оператора like. К примеру: ab_def%
Нужно собрать все записи, которые подходят друг другу, учитывая, что в обеих строках маски.
К примеру, записи выше подходят друг другу.
поясните, почему вы считаете что эти две маски подходят друг другу
строка "afcde", например, подходит первой маске, но не подходит второй
...
Рейтинг: 0 / 0
17.07.2014, 16:40
    #38699416
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
iapПредсказываю, что напишете "не получилось".
ну се ты так сразу :) Вдруг задача легче ?
...
Рейтинг: 0 / 0
17.07.2014, 16:42
    #38699424
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
Хотя, если формально написать алгоритм обработки строки каждой маской,
и они совпадут, то, значит, и сами маски равны.
...
Рейтинг: 0 / 0
17.07.2014, 16:43
    #38699425
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
ShakilljohnnygВ столбце таблицы A хранятся маски, подходящие для оператора like. К примеру: a_cde%
В столбце таблицы B также хранятся маски подходящие для оператора like. К примеру: ab_def%
Нужно собрать все записи, которые подходят друг другу, учитывая, что в обеих строках маски.
К примеру, записи выше подходят друг другу.
поясните, почему вы считаете что эти две маски подходят друг другу
строка "afcde", например, подходит первой маске, но не подходит второйДа. Пример, кстати, неправильный. Или имелось в виду что-то не то...
...
Рейтинг: 0 / 0
17.07.2014, 17:01
    #38699446
johnnyg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
Возможно не верно объяснил.
Мне нужно найти строки в таблицах A и B которые подходят друг другу учитывая, что в обеих строках маски.
В примере:
строка 1: a_cde%
строка 2: ab_def%
Подходят друг другу, т.к.:
на позиции 2 первой строки стоит символ '_', следовательно в строке 2 на этой позиции может быть что угодно.
на позиции 3 второй строки стоит символ '_', следовательно в строке 1 на этой позиции может быть что угодно.
на позиции 6 первой строки стоит символ '%', следовательно в строке 2 на этой позиции может быть что угодно или ничего не быть.
на позиции 7 второй строки стоит символ '%', следовательно в строке 1 на этой позиции может быть что угодно или ничего не быть.

Like не подходит. т.к. такой пример вернет нам в обоих выборках пустоту.
Код: sql
1.
2.
3.
4.
5.
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
...
Рейтинг: 0 / 0
17.07.2014, 17:13
    #38699465
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
johnnyg, но в строке 1 на третьей позиции стоит 'c', следовательно, во второй строке тоже должно быть 'c', а там '_'. не подходит
...
Рейтинг: 0 / 0
17.07.2014, 17:15
    #38699468
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
Shakilljohnnyg, но в строке 1 на третьей позиции стоит 'c', следовательно, во второй строке тоже должно быть 'c', а там '_'. не подходитВидно, он и не думает рассматривать обычные символы как часть маски?
Иначе вообще непонятно.
...
Рейтинг: 0 / 0
17.07.2014, 17:18
    #38699474
johnnyg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
Shakilljohnnyg, но в строке 1 на третьей позиции стоит 'c', следовательно, во второй строке тоже должно быть 'c', а там '_'. не подходит

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

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

Вопрос в том, можно ли это реализовать как-то по другому, кроме посимвольного сравнения?
...
Рейтинг: 0 / 0
17.07.2014, 17:19
    #38699477
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
Если предположить, что каждое знакоместо может быть представлено, скажем, 128 символами и длина маски не более 10,
то получим вполне компактный "шумовой" массив данных, на котором можно тестировать маски.
...
Рейтинг: 0 / 0
17.07.2014, 17:24
    #38699485
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
johnnygShakilljohnnyg, но в строке 1 на третьей позиции стоит 'c', следовательно, во второй строке тоже должно быть 'c', а там '_'. не подходит

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


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

интересно. строки 'привет%' и '%пока' будут подходить или нет и почему? и как вы собираетесь их посимвольно сравнивать?
...
Рейтинг: 0 / 0
17.07.2014, 17:27
    #38699488
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
Маски подходят, если хотя бы одна из них является множеством для остальных.
...
Рейтинг: 0 / 0
17.07.2014, 17:29
    #38699491
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
Владислав КолосовЕсли предположить, что каждое знакоместо может быть представлено, скажем, 128 символами и длина маски не более 10,
то получим вполне компактный "шумовой" массив данных, на котором можно тестировать маски.

Чет я загнул, это ж 128 в 10 степени.
...
Рейтинг: 0 / 0
17.07.2014, 17:33
    #38699495
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
Владислав КолосовМаски подходят, если хотя бы одна из них является множеством для остальных. не понял, поясните. в исходном примере ТС две маски, которые описывают два разных, частично пересекающихся множества строк.
...
Рейтинг: 0 / 0
17.07.2014, 17:39
    #38699500
johnnyg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
Shakillинтересно. строки 'привет%' и '%пока' будут подходить или нет и почему? и как вы собираетесь их посимвольно сравнивать?
Прощу прощения, небольшое уточнение: % может быть только в конце маски.

ShakillВладислав КолосовМаски подходят, если хотя бы одна из них является множеством для остальных. не понял, поясните. в исходном примере ТС две маски, которые описывают два разных, частично пересекающихся множества строк.
Нам нужно собрать только те строки, из обеих таблиц которые описывают два разных, частично пересекающихся множества строк.
Если их множества не пересекаются - не брать.
...
Рейтинг: 0 / 0
17.07.2014, 17:42
    #38699506
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
johnnyg частично пересекающихся
глобал вапрос - условие етой частичности у вас у самого сформированно как-то ?
...
Рейтинг: 0 / 0
17.07.2014, 18:00
    #38699530
johnnyg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
Maxxjohnnyg частично пересекающихся
глобал вапрос - условие етой частичности у вас у самого сформированно как-то ?
Прощу прощения - уточнение: частично и полностью пересекающиеся.
...
Рейтинг: 0 / 0
17.07.2014, 18:11
    #38699557
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
johnnygПрощу прощения - уточнение: частично и полностью пересекающиеся.

написали бы сразу - выбрать пары масок из таблиц A и B, для которых найдется хотя бы одна строка, подходящая обеим. быстрого решения для больших таблиц тут не вижу
...
Рейтинг: 0 / 0
17.07.2014, 18:31
    #38699585
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
Лучше CLR ничего не приходит в голову...
...
Рейтинг: 0 / 0
18.07.2014, 01:09
    #38699808
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
johnnyg
Я делаю это посимвольным сравнением, и на больших объемах данных всё происходит крайне медленно.Что вы называете большими объемами?
Какую скорость обработки вы ожидаете?
...
Рейтинг: 0 / 0
18.07.2014, 14:24
    #38700382
johnnyg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
Владислав КолосовЛучше CLR ничего не приходит в голову...
Если использовать CLR получится ли быстрее посимвольного сравнения в SQL?

MindjohnnygЯ делаю это посимвольным сравнением, и на больших объемах данных всё происходит крайне медленно.Что вы называете большими объемами?
Какую скорость обработки вы ожидаете?
По 100млн строк в каждой таблице.
Любому ускорению от 5% по сравнению с посимвольным сравнением буду рад.
...
Рейтинг: 0 / 0
18.07.2014, 14:54
    #38700431
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
johnnygПо 100млн строк в каждой таблице.
Любому ускорению от 5% по сравнению с посимвольным сравнением буду рад.
у вас два полных скана, некий расход памяти и проверка (100млн * 100млн ) пар.

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

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

и проверьте где у вас медленное звено
...
Рейтинг: 0 / 0
18.07.2014, 15:50
    #38700511
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
like когда в результирующей строке тоже маска
авторЕсли использовать CLR получится ли быстрее посимвольного сравнения в SQL?


Думаю, что на несколько порядков при том же посимвольном алгоритме (не знаю реализации).
Вам же требуется 10^16 - 10^8 сравнений...
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / like когда в результирующей строке тоже маска / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]