zoukankan      html  css  js  c++  java
  • MySQL基础知识:MySQL String 字符串处理

    字符串处理,在任何编程语言中,都是最重要的功能之一;因为在实际编程过程中,基本都会需要处理字符串;SQL也不例外。

    处理字符串的关键知识点:

    • 使用语言提供的字符串函数;
    • 正则表达式。

    之前,整理了一个虚拟书店的数据库并虚构了一些书籍的数据,这些数据还是有点乱的。借此练习MySQL字符串的处理。

    之前的文章:MySQL基础知识:创建MySQL数据库和表

    字符串长度

    有两种计算:

    • LENGTH(str):计算所用的 字节数
    • CHAR_LENGTH(str): 计算 字符数

    示例:

    SET @s = CONVERT('MySQL String Length' USING ucs2);
    SELECT CHAR_LENGTH(@s), LENGTH(@s);
    

    SET @s = CONVERT('MySQL string length' USING latin1);
    SELECT LENGTH(@s), CHAR_LENGTH(@s);
    

    应用示例:

    SELECT
    name, 
    author,
    IF(
        char_length(author) > 10, 
        concat(LEFT(author, 10), '...'),
        author
        ) as short_author
    FROM mysql_practice.book
    LIMIT 20;
    

    从字符串中移除字符

    TRIM():

    TRIM([{BOTH|LEADING|TRAILING} [removed_str]] FROM str);
    

    {BOTH|LEADING|TRAILING}默认是 BOTH[removed_str]]默认是空格。

    去除字符串前后空格

    select trim('  test string  ');
    

    等同于:

    select trim(both from '  test string  ');
    

    去除字符串前面的空格

    select trim(leading from '  test string  ');
    

    等同于:

    select ltrim('  test string  ');
    

    去除字符串末尾的空格

    select trim(trailing from '  test string  ');
    

    等同于:

    select rtrim('  test string  ');
    

    去除字符串末尾的 换行符

    SELECT 
        TRIM(TRAILING '
    ' FROM field_name) -- 
     为Unix或Linux系统换行符
    FROM table_name;
    
    SELECT 
        TRIM(TRAILING '
    ' FROM field_name) -- 
     为MacOS系统换行符
    FROM table_name;
    
    SELECT 
        TRIM(TRAILING '
    ' FROM field_name)
    FROM table_name;
    
    

    替换字符串

    trim(), ltrim, rtrim只能处理字符串开始和结尾的字符;如果要移除字符串中间的字符,可以使用replace()方法。

    REPLACE(target_str, str_to_find, str_to_replace);
    

    注意: 这个是字符串方法,MySQL还有一个REPLACE Statement用来insert或update数据的。

    支持表达式的replace方法

    REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]])
    

    官方文档的示例:

    mysql> SELECT REGEXP_REPLACE('a b c', 'b', 'X');
    +-----------------------------------+
    | REGEXP_REPLACE('a b c', 'b', 'X') |
    +-----------------------------------+
    | a X c                             |
    +-----------------------------------+
    
    mysql> SELECT REGEXP_REPLACE('abc def ghi', '[a-z]+', 'X', 1, 3);
    +----------------------------------------------------+
    | REGEXP_REPLACE('abc def ghi', '[a-z]+', 'X', 1, 3) |
    +----------------------------------------------------+
    | abc def X                                          |
    +----------------------------------------------------+
    

    实例:

    更新当前book表中publisher字段值:

    • 当前的字段值末尾都带有换行符,移除末尾换行符;
    • 当前的字段值都带了 加入购物车收藏加入购物车购买电子书收藏 文字,把这些文字都移除掉;
    use mysql_practice;
    
    -- 移除末尾的换行符
    UPDATE book SET publisher = trim(trailing '
    ' from publisher); -- MacOS
    
    -- 移除`加入购物车收藏` 或 `加入购物车购买电子书收藏`
    UPDATE book SET publisher = replace(publisher, '加入购物车收藏', '');
    UPDATE book SET publisher = replace(publisher, '加入购物车购买电子书收藏', '');
    
    -- 移除前后空格
    UPDATE book SET publisher = trim(publisher);
    

    查找、分割(split) 字符串

    • ELT()

    • FIND_IN_SET()

    • INSTR()

    • LOCATE() 和 POSITION()

    • REGEXP_INSTR()

    • REGEXP_SUBSTR()

    • SUBSTR() 和 SUBSTRING()

    • SUBSTRING_INDEX()

    • LEFT()

    • RIGHT()

    示例 1
    给定一个字符串表示:出版社 + 作者 + 书名 ;如:'电子工业出版社#孙卫琴#Tomcat与Java'
    根据分隔符 # 拆分字符串
    
    	SET @fullBookName = '电子工业出版社#孙卫琴#Tomcat与Java';
        SET @author_delimiter = '#';
    	SELECT 
    	SUBSTRING_INDEX(@fullBookName, @author_delimiter, 1) as publisher, 
    	SUBSTRING_INDEX(SUBSTRING_INDEX(@fullBookName, @author_delimiter, 2), @author_delimiter, -1) as author, 
    	SUBSTRING_INDEX(SUBSTRING_INDEX(@fullBookName, @author_delimiter, 3), @author_delimiter, -1) as book_name
    
    示例2
    给定一个字符串,截取前 n 个字符,并且不截断单词。
    输入:
        字符串: 'hello world, this is big test str!'
        n: 27
    输出:
        'hello world, this is big'
    

    如果直接使用

    select left(@test_str, @n);
    

    返回的结果是: hello world, this is big te,最后单词被截断。

    实现步骤:

    1. 获取@str最左边的@len长度字符串: LEFT(@str, @len);
    2. 反转获取的字串:REVERSE(LEFT(@str, @len))
    3. 找到反转后字串中第一个空格的位置tmpLocation:LOCATE(' ', REVERSE(LEFT(@str, @len)))
      • 注意:: LOCATE(substring, string, start);start表示开始的位置,可选,默认是1。没有找到的话,返回 0
    4. @len - tmpLocation为实际应该截取的位置;

    完整代码:

    set @str = 'hello world, this is big test str!';
    set @len = 8;
    
    SELECT
      LEFT(str, cutpos) AS str1,
      SUBSTRING(str, cutpos + 1) AS str2
    FROM 
    (
      SELECT @test_str AS str, @len - LOCATE(' ', REVERSE(LEFT(@str, @len))) AS cutpos
    ) s;
    
    
    示例3
    SELECT 
        productCode,
        RIGHT(productCode,
            LENGTH(productCode) - INSTR(productCode, '_')) productNo
    FROM
        products;
    

    拼接字符串

    • MySQL字符串连接符是空格: select 'hello' 'world';(PostgreSQL和Oracle的是 ||, SQL Server的是 +);
    • MySQL还提供了两个拼接字符串的方法:
      • concat
      • concat_ws 带分割符号

    参考资料

    1. 12.8 String Functions and Operators
    2. MySQL String Functions
    3. String truncate on length, but no chopping up of words allowed

    原文: MySQL基础知识:MySQL String 字符串处理

    微信公众号:编码者频道

    扫描二维码(或者长按识别二维码)关注公众号获取最新信息。

    本文版权归作者和博客园共有,欢迎转载,

    转载请保留原文链接,谢谢!

  • 相关阅读:
    NOIP201208同余方程
    NOIP模拟赛 最佳组合
    NOIP模拟赛 拓展
    CF1253E Antenna Coverage(DP)
    LOJ6033「雅礼集训 2017 Day2」棋盘游戏 (博弈论,二分图,匈牙利算法)
    CF582E Boolean Function(DP,状态压缩,FMT)
    CF750G New Year and Binary Tree Paths(DP)
    Codeforces Round 596 题解
    AGC008E Next or Nextnext(组合计数,神奇思路)
    ARC082E ConvexScore(神奇思路)
  • 原文地址:https://www.cnblogs.com/codesee/p/14547850.html
Copyright © 2011-2022 走看看