Hello,
select conv(hex(substring(
posting
, -2)), 16, 10)zahl
from postings where id=1223;
zahl -> 57Ich finde einfach den Rückweg nicht.
Wenn ich ein Tupel abtrenne0x0010001B0074005E0062 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