2011-09-11 12 views
5

Przede wszystkim mam bardzo konkretne pytanie, ale może też może mi pomóc alternatywne podejście do mojego problemu (druga część).Iteracja znaków w łańcuchu znaków w mysql

Czy istnieje sposób na adres znaku w ciągu za pośrednictwem indeksu w mysql. (np. w PHP $ var [2] da ci trzeci znak)?

Oczywistym sposobem jest SUBSTRING(var, 3,1), ale ponieważ moje ciągi mają długość 1024 znaków, zakładam, że nie jest to najszybsze rozwiązanie. Jak pokazano w przykładowym kodzie za pomocą podłańcucha do pobrania ogona struny również nie zyskuje różnica wydajności. Czy istnieje sposób na iterację ciągu znaków? (Shift pierwszy element?)

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 

Jeżeli nie już odczytać z kodu, staram się napisać procedurę przechowywaną, aby obliczyć różnicę lub odległość między do skrótów. Różnica jest sumą odległości kwadratowych od znaku (to jest hashDiff(AA,AC)=(65-65)²+(65-67)²=4). Pierwszy znaczny wzrost wydajności można osiągnąć poprzez wprowadzenie progu, aby anulować obliczenia, jeśli skróty już się różnią. Ale ponieważ mysql nie jest moim językiem "na co dzień", utknąłem w tym momencie w poszukiwaniu innych optymalizacji. Dla kompletności dwie próbki skróty:

YAAAAAAYAAAYAAVAAQAARAOAAOAQASAQAMAKAKAJIAJAJIAHAHIAKJAIIAHHAHIIAIHGAGFFAGGFEAFEEEEAEDDDDDAEEEEDEEEFAFFFFFFEFFFEFFFFFGFEEFFEEEFFFJEFFEEEEEEELFFFFEEFJEEEEDIEEEEEIEEEEHEEEJEEFKFEFKGGFNHGOIIJTJKYONYNMTGHNHHQISJJQIKWLXJJSMYRQWJOGKDDFCCBBAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAYAAAYAAWAARAASASAAQARAUAYAYATAOALKAJAJIAIAHHAHGAGFAFFAEFFAEFFAFFFAEEFFAFEEEDADEDDDDADDDCDDDDDAEEEFEEEEDDDEEEDEDDEEEFEFFGGFMFHGFFFGFFFLGHGGHGGNHHGGGOHGHGHMGGFGMFFFMFGFLFFFMGFFMGGMGGGNGGMGGLGGLGGMGGLEIEEHDCGCGCDGDGDCGDFCECCECECECECFCECFCFCFCFCFCGCJGYCYAAAAAAYAAAYAAUAATAAUAUAAUARARAQAPAPASARRAPARQAPAQQAQQAQSAKMATKKAIIHAIHGAGGGGAGHHGGAGGFGFFAFFGEFFFFFAFFGFGGGFFFEEFGFFGGFGGHIJJLKLWLKJJIJJJKJRLJKLKKKUKLLKKUMMKJIQIIIISKJJWKLLXMLMYMLNYMMYMLLWJIQIINFGKFFKEEIDHEDHDDFCECCFDECCFCFDGCDGCGCGEGCDCECECFDFCGDGCIEKEOAYNFBREUXKPQMMQTKT MMNJLPPVYYYTOUOPOLLJKKJJJIJIMJJJLIJJLLJIIHHIHHHIGHIHIHJHHHJHHIHGHGHFGHGFFEFEEEFEFEFFGGHIHIHGHGHHIIIIHIIJMNLONKLKKKKKKKMLKKLONMKOOOMLOPONMNMKKLLKKLMNKLMMMNMOPPOORPORSSVRTSSRTRRTSSTTXSTQRPONOKKLKLJMKJJIJIIHHHIIIJHIJIJJIJIKJIMWMYYDAAAAAAAAAAA

AAAAAAAAAAABAABAACAACACAACADADAEADADADADDAEAEEAEAFEAEEAEFAFGAGGGAGGGAHHHAHIIIAIHIJHAIIHIHHAJIHIJIJKJAJJJIKJJJJKKJKJKKLKLKLLMMMNNMYOOOOOOPOONYOONONNPYNOOOPYOOPPPYNONNYMLLWLLKUJIISHIHOGGMFGFLFFMGGLFGLGFLFFKFKFFLEEKFLEFJFKFGNGNHLFHJFIEGDIEKGOIRFGBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABABACACDACADDACADDADDAEDAFEAEEFAFFFAFFGAFGGGAIGHHIAHIHHHHAHIHIIJJIIAIIIIJIJKJIIIIJJHIIHIIIIJIIIIRJJJJKJJJJLVKLLKLLKXLMMKMXMLLLMWMMMMYMNLYMNNYNNMYMMNYMLYLMLXKJRIHPHIMGGMFEJEJEEIEEHDGCDFCFDCFCECECCEBEBECFDGCFDNGLDBAAAAAAAAAAAAAAAAAAAAAABAAAAABAABABAACACACACACACACADDADAEEAFAFGAFGAHGAGGAGGHAGGIAIHJAJJJJAJKKKKAMLMNNNANOMMNNMMNAONMNOOOMOOPOMNOMMNPOOPPPP RQQYPPRPPPPPNOYLLMMMMLYLMLMLYLMLMMYLNNMYNLLWMLKXLLLUKIKQIIQGHHPFHNGFLFFLGFJEEJEIDDIDCHDFCDGCFCCFCECECCECFCGDGDHDHDIFIDEBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAABBBBBCBCCCCDCCCCCCCCDDDDEDEEEEFFDEGGHGHHHGHHHHHHIIJJJJJIJJJJJJIKJJKLKKMMNMMMMMMMNNNNNNLNNONPONNNOOOOPQQQRSSSSSSUTSTUUUVWVVXUYXWVXVXWYVYWYVYYUWVUTTSSPQPQOPOPONONOMONOOONNNMMNLJJKJIIJHHGGGFHFGFFFFEEEDDEEEEFGGIGJLRNEAAAAAAAAAAAAA

Każda pomoc lub wskazówka będzie mile widziane.

+0

może być w stanie obsłużyć ciągi cztery bajty na raz z funkcją HEX. –

Odpowiedz

0

Jedynym sposobem, w jaki można użyć tablicy rodzajów, byłoby użycie tabel tymczasowych i kursorów/zestawów wyników.

Problem polega na tym, że nadal trzeba będzie powtórzyć ciągi i użyć podciągu, aby je rozdzielić. Zgodnie z moją wiedzą nie ma funkcji "wordwrap" lub "explode", aby rozciąć łańcuch.