Перебирать символы в строке в MySQL - PullRequest
5 голосов
/ 11 сентября 2011

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

Есть ли способ адресации символа в строке через его индекс в mysql. (т. е. в PHP $ var [2] даст вам третий символ)?

Очевидный способ - SUBSTRING(var, 3,1 ), но так как мои строки имеют длину 1024 символа, я предполагаю, что это не самое быстрое решение. Как показано в примере кода, использование подстроки для извлечения хвоста строки также не приводит к разнице в производительности. Есть ли способ перебрать строку? (Сдвинуть первый элемент?)

CREATE FUNCTION hashDiff( hash1 TEXT(1024), hash2 TEXT(1024), threshold INT) 
RETURNS INT
DETERMINISTIC
BEGIN
    DECLARE diff, x, b1, b2 INT;
    SET diff =0;
    SET x = 0;
    WHILE (x<1024 AND diff<threshold)  DO
        SET b1 = ASCII(hash1); --uses first character only!!
        SET b2 = ASCII(hash2);
        SET hash1=SUBSTRING(hash1, 2 );
        SET hash2=SUBSTRING(hash2, 2 );
        SET diff=diff+ ((b1-b2)*(b1-b2));
        SET x=x+1;
    END WHILE;
    RETURN diff;
END 

Если вы еще не прочитали его из кода, я попытаюсь написать хранимую процедуру для вычисления разницы или расстояния между хешами. Разница представляет собой сумму символьных квадратных расстояний (т.е. hashDiff(AA,AC)=(65-65)²+(65-67)²=4). Первое значительное повышение производительности может быть достигнуто путем введения порога для отмены вычислений, если хэши уже отличаются. Но так как mysql не мой язык "каждый день", я застрял на этом этапе поиска других оптимизаций. Для полноты двух образцов хэшей:

YAAAAAAYAAAYAAVAAQAARAOAAOAQASAQAMAKAKAJIAJAJIAHAHIAKJAIIAHHAHIIAIHGAGFFAGGFEAFEEEEAEDDDDDAEEEEDEEEFAFFFFFFEFFFEFFFFFGFEEFFEEEFFFJEFFEEEEEEELFFFFEEFJEEEEDIEEEEEIEEEEHEEEJEEFKFEFKGGFNHGOIIJTJKYONYNMTGHNHHQISJJQIKWLXJJSMYRQWJOGKDDFCCBBAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAYAAAYAAWAARAASASAAQARAUAYAYATAOALKAJAJIAIAHHAHGAGFAFFAEFFAEFFAFFFAEEFFAFEEEDADEDDDDADDDCDDDDDAEEEFEEEEDDDEEEDEDDEEEFEFFGGFMFHGFFFGFFFLGHGGHGGNHHGGGOHGHGHMGGFGMFFFMFGFLFFFMGFFMGGMGGGNGGMGGLGGLGGMGGLEIEEHDCGCGCDGDGDCGDFCECCECECECECFCECFCFCFCFCFCGCJGYCYAAAAAAYAAAYAAUAATAAUAUAAUARARAQAPAPASARRAPARQAPAQQAQQAQSAKMATKKAIIHAIHGAGGGGAGHHGGAGGFGFFAFFGEFFFFFAFFGFGGGFFFEEFGFFGGFGGHIJJLKLWLKJJIJJJKJRLJKLKKKUKLLKKUMMKJIQIIIISKJJWKLLXMLMYMLNYMMYMLLWJIQIINFGKFFKEEIDHEDHDDFCECCFDECCFCFDGCDGCGCGEGCDCECECFDFCGDGCIEKEOAYNFBREUXKPQMMQTKTMMNJLPPVYYYTOUOPOLLJKKJJJIJIMJJJLIJJLLJIIHHIHHHIGHIHIHJHHHJHHIHGHGHFGHGFFEFEEEFEFEFFGGHIHIHGHGHHIIIIHIIJMNLONKLKKKKKKKMLKKLONMKOOOMLOPONMNMKKLLKKLMNKLMMMNMOPPOORPORSSVRTSSRTRRTSSTTXSTQRPONOKKLKLJMKJJIJIIHHHIII JHIJIJJIJIKJIMWMYYDAAAAAAAAAAA

AAAAAAAAAAABAABAACAACACAACADADAEADADADADDAEAEEAEAFEAEEAEFAFGAGGGAGGGAHHHAHIIIAIHIJHAIIHIHHAJIHIJIJKJAJJJIKJJJJKKJKJKKLKLKLLMMMNNMYOOOOOOPOONYOONONNPYNOOOPYOOPPPYNONNYMLLWLLKUJIISHIHOGGMFGFLFFMGGLFGLGFLFFKFKFFLEEKFLEFJFKFGNGNHLFHJFIEGDIEKGOIRFGBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABABACACDACADDACADDADDAEDAFEAEEFAFFFAFFGAFGGGAIGHHIAHIHHHHAHIHIIJJIIAIIIIJIJKJIIIIJJHIIHIIIIJIIIIRJJJJKJJJJLVKLLKLLKXLMMKMXMLLLMWMMMMYMNLYMNNYNNMYMMNYMLYLMLXKJRIHPHIMGGMFEJEJEEIEEHDGCDFCFDCFCECECCEBEBECFDGCFDNGLDBAAAAAAAAAAAAAAAAAAAAAABAAAAABAABABAACACACACACACACADDADAEEAFAFGAFGAHGAGGAGGHAGGIAIHJAJJJJAJKKKKAMLMNNNANOMMNNMMNAONMNOOOMOOPOMNOMMNPOOPPPPRQQYPPRPPPPPNOYLLMMMMLYLMLMLYLMLMMYLNNMYNLLWMLKXLLLUKIKQIIQGHHPFHNGFLFFLGFJEEJEIDDIDCHDFCDGCFCCFCECECCECFCGDGDHDHDIFIDEBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAABBBBBCBCCCCDCCCCCCCCDDDDEDEEEEFFDEGGHGHHHGHHHHHHIIJJJJJIJJJJJJIKJJKLKKMMNMMMMMMMNNNNNNLNNONPONNNOOOOPQQQRSSSSSSUTSTUUUVWVVXUYXWVXVXWYVYWYVYYUWVUTTSSPQPQOPOPONONOMONOOONNNMMNLJJKJIIJHHGGGFHFGFFFFEE EDDEEEEFGGIGJLRNEAAAAAAAAAAAAA

Буду признателен за любую помощь или подсказку.

1 Ответ

0 голосов
/ 06 ноября 2014

Единственный способ использовать массив сортов - использовать временные таблицы и курсоры / наборы результатов.

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

...