Нечто подобное может сработать ... но, очевидно, будет крайне неэффективно.
SELECT ...
FROM table1 AS t1
INNER JOIN table2 AS t2 ON REPLACE(t1.uuid, '-', '')
= CONCAT(HEX(t2.upper_bits), HEX(t2.lower_bits))
...
... Вы можете использовать верхний / нижний регистр в зависимости от сопоставления / сравнения.
Я бы как-то склонялся к тому, чтобы быть "абсолютно необходимым" для изменения структуры вашей базы данных (чтобы ответить на комментарий, который вы сделали в другом ответе). Чтобы свести к минимуму влияние на существующие запросы и логику, вы можете изменить одну из таблиц, чтобы иметь дополнительные совпадающие поля с другой, и добавить триггеры в таблицу для автоматического заполнения / обновления новых полей; а затем выполните однократное обновление, чтобы установить значения всех старых записей.
Я бы сначала попытался изменить t1, поскольку индекс для двух целых чисел, вероятно, "лучше", чем для одной строки; но я не уверен, насколько простым будет преобразование строки в верхний и нижний биты.
Изменение t2 было бы проще, триггеры были бы немного больше, чем SET NEW.uuid = CONCAT(HEX(NEW.upper_bits), HEX(NEW.lower_bits));
... Я говорю "немного больше чем", потому что было бы лучше, чтобы триггер также вставил -
в также ожидаемые точки, поэтому условие соединения может исключить любое использование функции.
Редактировать: я нашел способ вычисления битов в чистом SQL:
SELECT @uuid := REPLACE('b33ac8a9-ae45-4120-bb6e-7537e271808e', '-', '') AS uuid
, -1 * CAST((~CAST(CONV(SUBSTRING(@uuid, 1, 16), 16, 10) AS SIGNED) + 1) AS SIGNED) AS upper_bits
, -1 * CAST((~CAST(CONV(SUBSTRING(@uuid, 17, 16), 16, 10) AS SIGNED) + 1) AS SIGNED) AS lower_bits
;
Возможно, вы сможете использовать что-то подобное в триггерах для t1 и одноразовом обновлении для t1 для новых полей.
... это может даже помочь с объединением:
ON -1 * CAST((~CAST(CONV(SUBSTRING(REPLACE(t1.uuid, '-', ''), 1, 16), 16, 10) AS SIGNED) + 1) AS SIGNED)
= t2.upper_bits
AND -1 * CAST((~CAST(CONV(SUBSTRING(REPLACE(t1.uuid, '-', ''), 17, 16), 16, 10) AS SIGNED) + 1) AS SIGNED)
= t2.lower_bits
Примечание. Да, чрезмерное приведение в обоих случаях представляется необходимым (по крайней мере, в более старой версии MySQL, с которой я проверял вычисления).