2011-09-11 18 views
5

Primero, tengo una pregunta muy concreta, pero tal vez un enfoque alternativo a mi problema (segunda parte) también podría ayudarme.Iterar caracteres en cadena en mysql

Hay una manera de abordar un carácter en una cadena a través de su índice en mysql. (es decir, en PHP $ var [2] le dará el tercer carácter)?

La manera obvia es SUBSTRING(var, 3,1) pero como mis cadenas tienen 1024 caracteres, supongo que esta no es la solución más rápida. Tal como se muestra en el ejemplo de código que utiliza una subcadena para recuperar la cola de la cadena, tampoco gana diferencia de rendimiento. ¿Hay quizás una forma de iterar sobre una cadena? (Shift primer elemento?)

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 

Si no lo ha leído a partir del código, trato de escribir un procedimiento almacenado para calcular la diferencia o distancia entre a hashes. La diferencia es la suma de las distancias cuadradas de los caracteres (es decir, hashDiff(AA,AC)=(65-65)²+(65-67)²=4). El primer gran aumento de rendimiento podría lograrse introduciendo un umbral para cancelar el cálculo si los valores hash ya son diferentes. Pero como mysql no es mi lenguaje de "todos los días", me quedé en este momento buscando otras optimizaciones. Para completar la muestra de dos hashes:

YAAAAAAYAAAYAAVAAQAARAOAAOAQASAQAMAKAKAJIAJAJIAHAHIAKJAIIAHHAHIIAIHGAGFFAGGFEAFEEEEAEDDDDDAEEEEDEEEFAFFFFFFEFFFEFFFFFGFEEFFEEEFFFJEFFEEEEEEELFFFFEEFJEEEEDIEEEEEIEEEEHEEEJEEFKFEFKGGFNHGOIIJTJKYONYNMTGHNHHQISJJQIKWLXJJSMYRQWJOGKDDFCCBBAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAYAAAYAAWAARAASASAAQARAUAYAYATAOALKAJAJIAIAHHAHGAGFAFFAEFFAEFFAFFFAEEFFAFEEEDADEDDDDADDDCDDDDDAEEEFEEEEDDDEEEDEDDEEEFEFFGGFMFHGFFFGFFFLGHGGHGGNHHGGGOHGHGHMGGFGMFFFMFGFLFFFMGFFMGGMGGGNGGMGGLGGLGGMGGLEIEEHDCGCGCDGDGDCGDFCECCECECECECFCECFCFCFCFCFCGCJGYCYAAAAAAYAAAYAAUAATAAUAUAAUARARAQAPAPASARRAPARQAPAQQAQQAQSAKMATKKAIIHAIHGAGGGGAGHHGGAGGFGFFAFFGEFFFFFAFFGFGGGFFFEEFGFFGGFGGHIJJLKLWLKJJIJJJKJRLJKLKKKUKLLKKUMMKJIQIIIISKJJWKLLXMLMYMLNYMMYMLLWJIQIINFGKFFKEEIDHEDHDDFCECCFDECCFCFDGCDGCGCGEGCDCECECFDFCGDGCIEKEOAYNFBREUXKPQMMQTKT MMNJLPPVYYYTOUOPOLLJKKJJJIJIMJJJLIJJLLJIIHHIHHHIGHIHIHJHHHJHHIHGHGHFGHGFFEFEEEFEFEFFGGHIHIHGHGHHIIIIHIIJMNLONKLKKKKKKKMLKKLONMKOOOMLOPONMNMKKLLKKLMNKLMMMNMOPPOORPORSSVRTSSRTRRTSSTTXSTQRPONOKKLKLJMKJJIJIIHHHIIIJHIJIJJIJIKJIMWMYYDAAAAAAAAAAA

AAAAAAAAAAABAABAACAACACAACADADAEADADADADDAEAEEAEAFEAEEAEFAFGAGGGAGGGAHHHAHIIIAIHIJHAIIHIHHAJIHIJIJKJAJJJIKJJJJKKJKJKKLKLKLLMMMNNMYOOOOOOPOONYOONONNPYNOOOPYOOPPPYNONNYMLLWLLKUJIISHIHOGGMFGFLFFMGGLFGLGFLFFKFKFFLEEKFLEFJFKFGNGNHLFHJFIEGDIEKGOIRFGBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABABACACDACADDACADDADDAEDAFEAEEFAFFFAFFGAFGGGAIGHHIAHIHHHHAHIHIIJJIIAIIIIJIJKJIIIIJJHIIHIIIIJIIIIRJJJJKJJJJLVKLLKLLKXLMMKMXMLLLMWMMMMYMNLYMNNYNNMYMMNYMLYLMLXKJRIHPHIMGGMFEJEJEEIEEHDGCDFCFDCFCECECCEBEBECFDGCFDNGLDBAAAAAAAAAAAAAAAAAAAAAABAAAAABAABABAACACACACACACACADDADAEEAFAFGAFGAHGAGGAGGHAGGIAIHJAJJJJAJKKKKAMLMNNNANOMMNNMMNAONMNOOOMOOPOMNOMMNPOOPPPP RQQYPPRPPPPPNOYLLMMMMLYLMLMLYLMLMMYLNNMYNLLWMLKXLLLUKIKQIIQGHHPFHNGFLFFLGFJEEJEIDDIDCHDFCDGCFCCFCECECCECFCGDGDHDHDIFIDEBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAABBBBBCBCCCCDCCCCCCCCDDDDEDEEEEFFDEGGHGHHHGHHHHHHIIJJJJJIJJJJJJIKJJKLKKMMNMMMMMMMNNNNNNLNNONPONNNOOOOPQQQRSSSSSSUTSTUUUVWVVXUYXWVXVXWYVYWYVYYUWVUTTSSPQPQOPOPONONOMONOOONNNMMNLJJKJIIJHHGGGFHFGFFFFEEEDDEEEEFGGIGJLRNEAAAAAAAAAAAAA

Cualquier ayuda o sugerencia sería apreciada.

+0

es posible que pueda manejar sus cadenas de cuatro bytes a la vez con la función HEX. –

Respuesta

0

La única forma en que podría usar una matriz de clases sería usar tablas temporales y cursores/conjuntos de resultados.

El problema es que aún tendrá que iterar sobre las cadenas y utilizar la subcadena para separarlas. Que yo sepa, no hay una función de 'efecto de palabra' o 'explosión' para cortar la cadena.

Cuestiones relacionadas