【问题标题】:select only digits, numbers from text仅选择数字,文本中的数字
【发布时间】:2019-01-15 05:01:01
【问题描述】:

我有一个字段文本,里面有这样的信息

sch hcbhsc hscbshcbc  xxxxxxxx sgxfag jdhajdh;

dchbdbc bdcbdh bchdbd  xx/xx-xxxx/xx svdhs sbjbsc

bdchbdc jncjdnc jbcjb  xx/xx-xxxxx/xx gcvsgc jcbjsb

dchjbd bhjcbdcb bdcbcd  xx-xxxx/xx shchscv hscbhsc

dhcbhd jdcbjdb jdcnjdcn  xx-xxxxx/xx shcvsch jbscjc

地方 x 只是一个数字,我需要写 select 并且只取那些数字

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    在 SQL 服务器中使用 SUBSTRING 和 PATINDEX 字符串函数:

       SELECT SUBSTRING(Your_FieldName, PATINDEX('%[0-9]%', Your_FieldName),
       LEN(Your_FieldName))
    

    对于 MYSQL,请参考以下网址:

    Query to get only numbers from a string 字符串

    【讨论】:

    • FUNCTION databasename.PATINDEX 不存在
    【解决方案2】:

    MySQL 中没有正式的 PATINDEX() 函数来实现正则表达式模式查找和返回的字符索引,定义用户定义的函数,循环遍历字符串长度中的每个字符并检查字符上的正则表达式模式。创建后,在查询中使用这样的函数。

    DROP FUNCTION IF EXISTS PatIndex;
    
    DELIMITER $$
    
    CREATE FUNCTION PatIndex(pattern VARCHAR(255), tblString VARCHAR(255)) RETURNS INTEGER
    DETERMINISTIC
    BEGIN
    
    DECLARE i INTEGER;
    SET i = 1;
    
    myloop: WHILE (i <= LENGTH(tblString)) DO
    
        IF SUBSTRING(tblString, i, 1) REGEXP pattern THEN
            RETURN(i);
            LEAVE myloop;        
        END IF;    
    
        SET i = i + 1;
    
    END WHILE; 
    
    RETURN(0);
    
    END
    

    【讨论】:

    • FUNCTION databasename.LEN 不存在
    • 使用 LENGTH 而不是 LEN
    【解决方案3】:

    这里有一个 MySQL 函数(例程)可以做到这一点。这是此处给出的解决方案的改进版本:how-to-get-only-digits-from-string-in-mysql

    这个改进的版本可以处理更大的数字。旧的解决方案受到 INTEGER 值的限制,因此如果您有电话号码(或包含许多数字的字符串),它将失败,列超出范围

    DELIMITER $$ 
    CREATE FUNCTION ExtractNumber (in_string VARCHAR(50)) 
        RETURNS varchar(50)
        NO SQL
    BEGIN
        DECLARE ctrNumber VARCHAR(50);
        DECLARE finNumber VARCHAR(50) DEFAULT '';
        DECLARE sChar VARCHAR(1);
        DECLARE inti VARCHAR(50) DEFAULT 1;
    
        IF LENGTH(in_string) > 0 THEN
            WHILE(inti <= LENGTH(in_string)) DO
                SET sChar = SUBSTRING(in_string, inti, 1);
                SET ctrNumber = FIND_IN_SET(sChar, '0,1,2,3,4,5,6,7,8,9'); 
                IF ctrNumber > 0 THEN
                    SET finNumber = CONCAT(finNumber, sChar);
                END IF;
                SET inti = inti + 1;
            END WHILE;
            RETURN CAST(finNumber AS UNSIGNED);
        ELSE
            RETURN 0;
        END IF;    
    END$$
    DELIMITER ;
    

    现在你可以这样做了:

    SELECT ExtractNumber(my_field)
    FROM my_table;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多