Tom: Lösung

Beitrag lesen

Hello,

select conv(hex(substring(posting, -2)), 16, 10) zahl from postings where id=1223;
zahl -> 57

Ich finde einfach den Rückweg nicht.
Wenn ich ein Tupel abtrenne

0x0010001B0074005E0062     0039

Lösung gefunden.
1. es geht ohne LIKE, das sagte auch EXPLAIN. Darum hat es überhaupt nur funktioniert...
2. Die Rechnung mit den Tupeln und Rückwandlung klappt jatzt auch, wenn auch recht umständlich.
   ORD(), HEX(), UNHEX(), SUBSTRING(), LENGTH() helfen dabei.
   Das Geheimnis waren die fehlenden führenden Nullen bei HEX(N).

Bisschen Überarbeitung zur Verschlankung ist noch notwendig und Parameter für die universelle Verwendung auf beliebige VARBINARY-Spalten beliebiger Tabellen.

Leider bekomme ich die beiden Selects noch nicht zusammengefasst.

  
  
DELIMITER $$  
DROP FUNCTION IF EXISTS next_posting$$  
CREATE FUNCTION next_posting (p_id BIGINT, p_sub INTEGER)  
    RETURNS VARBINARY(256)  
    DETERMINISTIC  
    BEGIN  
        DECLARE code1, code2, code3, next, ret VARBINARY(256);  
	DECLARE diff, len, wert INT;  
	  
	SET diff = 2;  
	if p_sub = 1 then  
	    SET diff = 0;  
	end if;  
	  
        SELECT `posting` from `postings` where `id` = p_id into code1;  
        SET len = length(code1);  
        SET code2 = substring(code1, 1, len - diff); 	  
  
 	select max(substring(`posting`, 1, length(code2) +2 ))  
	   from `postings`  
	   where substring(`posting`, 1, length(code2)) = code2  
	   into code3;  
  
	set ret = code3;  
  
        IF (code1 = code3) and (p_sub = 1) then  
	    SET ret = concat(code3, 0x0001);  
        ELSE  
	    set len = length(code3);  
	    set wert = ord(substring(code3, @len-1, 1)) * 256 + ord(substring(code3, len, 1)) +1;  
	    set ret = unhex(concat(hex(substring(code3, 1, len-2)), substring(concat('00', hex(wert)),-4)));  
        END if;  
	  
    RETURN ret;  
END$$  
DELIMITER ;  
  
  

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
 ☻_
/▌
/ \ Nur selber lernen macht schlau
http://bikers-lodge.com