regex 连接两个字段并替换特殊/空格字符

x33g5p2x  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(96)

我有如下所示的示例数据:
| fname|lname|
| --------------|--------------|
| x abc|jkn|
| 测试|测试GTH|
| YG-TXS|GB@y|
需要将简单查询写入

  • 删除所有特殊字符和空格,
  • 联系fname和lname
  • 将其放在fullname列中,而此字段中包含的值必须没有空格和特殊字符。

需要优化查询,因为我们有数百万的数据。
“* 预期输出 *":
| fname|lname|全名|
| --------------|--------------|--------------|
| x abc|jkn|Xabcjkn|
| 测试|测试GTH|测试testgth|
| YG-TXS|GB@y|ygtxsgby|
我试过下面,它没有工作:

  • REGEXP_REPLACE({column}, '[^0-9a-zA-Z ]', '')
  • (REPLACE(CONCAT(fname,lname), '[$!&*_;:@#+\'=%^,<.>/?|~-]', '')
rta7y2nd

rta7y2nd1#

正如在评论部分已经指出的那样,您的问题与regex中存在的空间有关。此外,如果您的要求是名字和姓氏之间没有空格,那么仅使用一次REGEXP_REPLACE可能会给予您的效率提高幅度。

SELECT fname,
       lname,
       REGEXP_REPLACE(CONCAT(fname,lname), '[^0-9a-zA-Z]', '') AS fullname
FROM tab

输出

fnamelname全名
x abcjknXabcjkn
测试测试GTH测试testgth
YG-TXSGB@yygtxsgby

检查演示here
注意:如果您不能使用REGEXP_REPLACE命令,您应该请求您的提供程序的权限。只要您正在处理数百万个数据并需要优化的解决方案,这一点就非常重要。

fnvucqvd

fnvucqvd2#

您只需要删除REGEX上的空间,其余的看起来都很好

Schema(MySQL v8.0)

CREATE TABLE tableName 
(
    fname   VARCHAR(512),
    lname   VARCHAR(512)
);

INSERT INTO tableName (fname, lname) VALUES ('x abc', 'jkn');
INSERT INTO tableName (fname, lname) VALUES ('test', 'test gth');
INSERT INTO tableName (fname, lname) VALUES ('yg-txs', 'gb@y');

查询#1

SELECT  REGEXP_REPLACE(fname, '[^0-9a-zA-Z ]', '')fname, 
        REGEXP_REPLACE(lname, '[^0-9a-zA-Z ]', '')lname, 
        CONCAT(REGEXP_REPLACE(fname, '[^0-9a-zA-Z]', ''),
               REGEXP_REPLACE(lname, '[^0-9a-zA-Z]', '')
        ) fullname 
FROM tableName;
fnamelname全名
x abcjknXabcjkn
测试测试GTH测试testgth
ygtxsgbyygtxsgby

相关问题