我有一张约500k行的桌子; varchar(255)UTF8列filename包含文件名;
我试图从文件名中删除各种奇怪的字符 - 我以为我会使用一个字符类: [^a-zA-Z0-9()_ .\-]
现在,MySQL中是否有一个函数可以让你通过正则表达式替换?我正在寻找与REPLACE()函数类似的功能 - 简化示例如下:
SELECT REPLACE('stackowerflow', 'ower', 'over');
Output: "stackoverflow"
/* does something like this exist? */
SELECT X_REG_REPLACE('Stackoverflow','/[A-Zf]/','-');
Output: "-tackover-low"
Run Code Online (Sandbox Code Playgroud)
我知道REGEXP/RLIKE,但那些只检查是否有匹配,没有什么比赛是.
(我可以SELECT pkey_id,filename FROM foo WHERE filename RLIKE '[^a-zA-Z0-9()_ .\-]'从PHP脚本做一个" ",做一个preg_replace然后" UPDATE foo ... WHERE pkey_id=...",但这看起来像一个最后的缓慢和丑陋的黑客)
我想创建一个名为XMLify的mysql函数,它接受一个字符串和一个将返回一个集合的表达式
XMLify(string, expr)
该函数应将集合中每个返回行的每个返回字段包装到其自己的XML标记中.标签的名称应该是字段名称.
小例子:
select XMLify('foo', (SELECT 1 as `a`, 2 as `b` UNION SELECT 3 as `a`, 4 as `b`));
Run Code Online (Sandbox Code Playgroud)
应该返回:
<foo><a>1</a><b>2</b></foo><foo><a>3</a><b>4</b></foo>
Run Code Online (Sandbox Code Playgroud)
我想拥有它,因为它将使我能够运行具有许多连接和/或从属子查询的复杂查询,而无需将冗余数据返回给客户端.
我已经有一个没有我想要构建的功能的解决方法.但这涉及编写难以维护的难题.请参阅下面的示例.
确保字段名称是合法的XML节点名称是为了以后的担心.一旦函数成立,我将考虑一些算法,它将获取字段名称并将其转换为一些合法的XML节点名称.
转义XML数据也是为了以后担心.这将通过一个名为的不同函数来完成,该函数CDATAify将简单地将所有数据包装到<![CDATA[和中]]>,并且将]]>在数据中的任何先前出现中转义]]]]><![CDATA[>.
我无法使用MySQL中的存储函数来完成此操作,因为这些函数不会接受结果集.此外,即使您将SQL作为字符串传递,然后准备语句并执行它,如果您还不知道字段名称,则无法访问这些字段.
所以现在我想知道是否可以使用用户定义的函数(UDF)来完成这个技巧.这是我还没有合作过的东西,我想在你开玩笑之前给你建议.
所以我现在的问题是:
想象一下,有以下3个表格:
users: grades: toys:
+----+------+ +--------+-------+ +--------+--------------+
| id | name | | userid | grade | | userid | toy |
+----+------+ +--------+-------+ +--------+--------------+ …Run Code Online (Sandbox Code Playgroud)