|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
Добрый день, All! Подскажите пожалуйста, как можно лучшим образом решить следующую задачу: В столбце таблицы A хранятся маски, подходящие для оператора like. К примеру: a_cde% В столбце таблицы B также хранятся маски подходящие для оператора like. К примеру: ab_def% Нужно собрать все записи, которые подходят друг другу, учитывая, что в обеих строках маски. К примеру, записи выше подходят друг другу. Я делаю это посимвольным сравнением, и на больших объемах данных всё происходит крайне медленно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 16:27 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
а чем like не устроил то ? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 16:28 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
Maxxа чем like не устроил то ?Наверно, тем, что каждая маска задаёт множество бесконечного количества строк, которые ей удовлетворяют. А надо доказать, что множества строк, порождённые двумя разными масками, равны друг другу. johnnyg, лет через 30 напишите здесь, получилось у Вас что-нибудь или нет. Предсказываю, что напишете "не получилось". ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 16:36 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
johnnygВ столбце таблицы A хранятся маски, подходящие для оператора like. К примеру: a_cde% В столбце таблицы B также хранятся маски подходящие для оператора like. К примеру: ab_def% Нужно собрать все записи, которые подходят друг другу, учитывая, что в обеих строках маски. К примеру, записи выше подходят друг другу. поясните, почему вы считаете что эти две маски подходят друг другу строка "afcde", например, подходит первой маске, но не подходит второй ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 16:39 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
iapПредсказываю, что напишете "не получилось". ну се ты так сразу :) Вдруг задача легче ? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 16:40 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
Хотя, если формально написать алгоритм обработки строки каждой маской, и они совпадут, то, значит, и сами маски равны. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 16:42 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
ShakilljohnnygВ столбце таблицы A хранятся маски, подходящие для оператора like. К примеру: a_cde% В столбце таблицы B также хранятся маски подходящие для оператора like. К примеру: ab_def% Нужно собрать все записи, которые подходят друг другу, учитывая, что в обеих строках маски. К примеру, записи выше подходят друг другу. поясните, почему вы считаете что эти две маски подходят друг другу строка "afcde", например, подходит первой маске, но не подходит второйДа. Пример, кстати, неправильный. Или имелось в виду что-то не то... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 16:43 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
Возможно не верно объяснил. Мне нужно найти строки в таблицах A и B которые подходят друг другу учитывая, что в обеих строках маски. В примере: строка 1: a_cde% строка 2: ab_def% Подходят друг другу, т.к.: на позиции 2 первой строки стоит символ '_', следовательно в строке 2 на этой позиции может быть что угодно. на позиции 3 второй строки стоит символ '_', следовательно в строке 1 на этой позиции может быть что угодно. на позиции 6 первой строки стоит символ '%', следовательно в строке 2 на этой позиции может быть что угодно или ничего не быть. на позиции 7 второй строки стоит символ '%', следовательно в строке 1 на этой позиции может быть что угодно или ничего не быть. Like не подходит. т.к. такой пример вернет нам в обоих выборках пустоту. Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 17:01 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
johnnyg, но в строке 1 на третьей позиции стоит 'c', следовательно, во второй строке тоже должно быть 'c', а там '_'. не подходит ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 17:13 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
Shakilljohnnyg, но в строке 1 на третьей позиции стоит 'c', следовательно, во второй строке тоже должно быть 'c', а там '_'. не подходитВидно, он и не думает рассматривать обычные символы как часть маски? Иначе вообще непонятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 17:15 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
Shakilljohnnyg, но в строке 1 на третьей позиции стоит 'c', следовательно, во второй строке тоже должно быть 'c', а там '_'. не подходит Так я же пишу: на позиции 3 второй строки стоит символ '_', следовательно в строке 1 на этой позиции может быть что угодно. У меня появилась идея это реализовать только посимвольным сравнением: Идем по обеим строкам: Если в первой строке на данной позиции '_' или во второй на данной позиции '_', то переходим к следующему символу, если нет то сравниваем символы в строках на данной позиции. Ну для '%' понятно. Вопрос в том, можно ли это реализовать как-то по другому, кроме посимвольного сравнения? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 17:18 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
Если предположить, что каждое знакоместо может быть представлено, скажем, 128 символами и длина маски не более 10, то получим вполне компактный "шумовой" массив данных, на котором можно тестировать маски. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 17:19 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
johnnygShakilljohnnyg, но в строке 1 на третьей позиции стоит 'c', следовательно, во второй строке тоже должно быть 'c', а там '_'. не подходит Так я же пишу: на позиции 3 второй строки стоит символ '_', следовательно в строке 1 на этой позиции может быть что угодно. это проверка применимости второй маски к первой строке, а где проверка применимости первой маски ко второй? или применять можно как попало? johnnygУ меня появилась идея это реализовать только посимвольным сравнением: Идем по обеим строкам: Если в первой строке на данной позиции '_' или во второй на данной позиции '_', то переходим к следующему символу, если нет то сравниваем символы в строках на данной позиции. Ну для '%' понятно. интересно. строки 'привет%' и '%пока' будут подходить или нет и почему? и как вы собираетесь их посимвольно сравнивать? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 17:24 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
Маски подходят, если хотя бы одна из них является множеством для остальных. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 17:27 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
Владислав КолосовЕсли предположить, что каждое знакоместо может быть представлено, скажем, 128 символами и длина маски не более 10, то получим вполне компактный "шумовой" массив данных, на котором можно тестировать маски. Чет я загнул, это ж 128 в 10 степени. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 17:29 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
Владислав КолосовМаски подходят, если хотя бы одна из них является множеством для остальных. не понял, поясните. в исходном примере ТС две маски, которые описывают два разных, частично пересекающихся множества строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 17:33 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
Shakillинтересно. строки 'привет%' и '%пока' будут подходить или нет и почему? и как вы собираетесь их посимвольно сравнивать? Прощу прощения, небольшое уточнение: % может быть только в конце маски. ShakillВладислав КолосовМаски подходят, если хотя бы одна из них является множеством для остальных. не понял, поясните. в исходном примере ТС две маски, которые описывают два разных, частично пересекающихся множества строк. Нам нужно собрать только те строки, из обеих таблиц которые описывают два разных, частично пересекающихся множества строк. Если их множества не пересекаются - не брать. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 17:39 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
johnnyg частично пересекающихся глобал вапрос - условие етой частичности у вас у самого сформированно как-то ? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 17:42 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
Maxxjohnnyg частично пересекающихся глобал вапрос - условие етой частичности у вас у самого сформированно как-то ? Прощу прощения - уточнение: частично и полностью пересекающиеся. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 18:00 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
johnnygПрощу прощения - уточнение: частично и полностью пересекающиеся. написали бы сразу - выбрать пары масок из таблиц A и B, для которых найдется хотя бы одна строка, подходящая обеим. быстрого решения для больших таблиц тут не вижу ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 18:11 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
Лучше CLR ничего не приходит в голову... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2014, 18:31 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
johnnyg Я делаю это посимвольным сравнением, и на больших объемах данных всё происходит крайне медленно.Что вы называете большими объемами? Какую скорость обработки вы ожидаете? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2014, 01:09 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
Владислав КолосовЛучше CLR ничего не приходит в голову... Если использовать CLR получится ли быстрее посимвольного сравнения в SQL? MindjohnnygЯ делаю это посимвольным сравнением, и на больших объемах данных всё происходит крайне медленно.Что вы называете большими объемами? Какую скорость обработки вы ожидаете? По 100млн строк в каждой таблице. Любому ускорению от 5% по сравнению с посимвольным сравнением буду рад. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2014, 14:24 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
johnnygПо 100млн строк в каждой таблице. Любому ускорению от 5% по сравнению с посимвольным сравнением буду рад. у вас два полных скана, некий расход памяти и проверка (100млн * 100млн ) пар. если маски повторяются в пределах одной таблицы, можно дистинктом уменьшить количество проверяемых пар, но получим затраты на дистинкт; можно отсеять обратные друг другу комбинации; можно сразу выбрать одинаковые маски из A и B как подходящие, можно сразу выбрать случаи когда одна маска покрывает другую и т.д. вместо посимвольного сравнения можно перейти к самой сути вашей задачи http://stackoverflow.com/questions/2966865/intersection-of-two-regular-expressions , но боюсь, что будет еще медленнее. и проверьте где у вас медленное звено ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2014, 14:54 |
|
like когда в результирующей строке тоже маска
|
|||
---|---|---|---|
#18+
авторЕсли использовать CLR получится ли быстрее посимвольного сравнения в SQL? Думаю, что на несколько порядков при том же посимвольном алгоритме (не знаю реализации). Вам же требуется 10^16 - 10^8 сравнений... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2014, 15:50 |
|
|
start [/forum/topic.php?fid=46&msg=38699424&tid=1701306]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
185ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 245ms |
total: | 543ms |
0 / 0 |