【问题标题】:Crossfade two ore more strings in MySQL or MariaDB在 MySQL 或 MariaDB 中交叉淡入淡出两个或多个字符串
【发布时间】:2021-05-13 11:11:05
【问题描述】:

我正在寻找一种在 MySQL 或 MariaDB 中重叠/交叉淡化两个或多个字符串的精简方法。

有一个像这样的基本字符串:

XXXOOOOOOOXXX

然后有 n 个字符串需要交叉淡化该基本字符串。此演示案例中的规则是 X 应该是优先级。字符串可以有不同的长度。

所以这个字符串与基本字符串重叠:

OOOOOXOOOOOOOOOX
XXOOOXXOOOOOXXXXO

应该导致:

XXXOOXXOOOXXXXXXO

我可以在 PHP 中做到这一点,但也许 MySQL 或 MariaDB 中有一个函数可以使它更快。

【问题讨论】:

  • 请解释一下“crossfade”是什么意思。这不是我熟悉的词。
  • @GordonLinoff 只是一个猜测,它似乎是某种按位运算,其中“位”是XO
  • 我试图在例子中解释它。字符串是相互叠加的,而 X 字符始终具有优先权,并优先于 O 字符。
  • 如果您可以将字符串转换为(块)位字符串,其中“O”为 0,“X”为 1 个较短的字符串,右填充到较长字符串的长度(并返回),你可以使用二进制或:dbfiddle.uk/…
  • 听起来很有趣。谢谢!

标签: mysql sql mariadb


【解决方案1】:

MySQL 中没有一个函数可以做到这一点,但可以创建一个函数:

CREATE DEFINER=`root`@`localhost` FUNCTION `crossfade`(
    a VARCHAR(100), 
    b VARCHAR(100)) RETURNS varchar(100) CHARSET utf8mb4
BEGIN
   DECLARE i INTEGER DEFAULT 1;
   DECLARE r VARCHAR(100) DEFAULT '';
   -- Make input equally long
   IF LENGTH(a) < LENGTH(b) THEN
      SET A = RPAD(A,LENGTH(b),' ');
   ELSE
      SET B = RPAD(B,LENGTH(a),' ');
   END IF;
   WHILE i<=LENGTH(a) DO
       IF substring(a,i,1)='X' THEN
         SET r = concat(r,substring(a,i,1));
       ELSE
         SET r = concat(r,substring(b,i,1));
       END IF;
       SET i = i + 1;
   END WHILE;
RETURN r;
END

例子:

SELECT crossfade('OOOOOXOOOOOOOOOX','XXOOOXXOOOOOXXXXO');

输出:

+ ------------------------------------------------------ +
| crossfade('OOOOOXOOOOOOOOOX','XXOOOXXOOOOOXXXXO')      |
+ ------------------------------------------------------ +
| XXOOOXXOOOOOXXXXO                                      |
+ ------------------------------------------------------ +

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    相关资源
    最近更新 更多