MySQL 如何从 varchar 列中获取精确的整数值

Posted

技术标签:

【中文标题】MySQL 如何从 varchar 列中获取精确的整数值【英文标题】:MySQL How to get exact integer values from the varchar column 【发布时间】:2016-09-12 07:28:40 【问题描述】:

我有一个名为“Costdetails”的表。

有一个名为'cost'的列,它是一个VARCHAR列。它可以是任何东西,如下所示。

Cost ssss
20000 - $
Rs - 1000/-
10000 Rupees etc.

我想从这个 varchar 列中取出确切的数量(Ex: 1000、20000)。 在谷歌上试过这个,我得到了一个查询,然后我尝试了这个查询。

SELECT cost
FROM Costdetails
WHERE (cost REGEXP '^[0-9]' or cost REGEXP '[0-9]^' or cost REGEXP '[0-9]');


Output :

Rs-1000/-
10000 - $
$ 10000

此查询帮助我获取具有整数值的行。 但是想从列中删除多余的东西(输出:Like 1000,Not like Rs-1000/-)。

任何想法,提前谢谢!!!。

【问题讨论】:

我不认为 mysql 具有开箱即用的正则表达式功能。能不能先用Notepad++之类的程序,再把数据导入MySQL? ***.com/questions/986826/… 我想为此编写脚本。它应该获取列并根据要求进行更改,并将数据放入其他表中。 我认为这个问题可能会有所帮助:***.com/q/13027309/2869791 GIGO -- 将数据放入数据库之前解析数据。 【参考方案1】:

您可以使用函数来完成您的查询。例如:-

 SET GLOBAL log_bin_trust_function_creators=1;
DROP FUNCTION IF EXISTS digits;
DELIMITER |
CREATE FUNCTION digits( str CHAR(32) ) RETURNS CHAR(32)
BEGIN
  DECLARE i, len SMALLINT DEFAULT 1;
  DECLARE ret CHAR(32) DEFAULT '';
  DECLARE c CHAR(1);

  IF str IS NULL
  THEN 
    RETURN "";
  END IF;

  SET len = CHAR_LENGTH( str );
  REPEAT
    BEGIN
      SET c = MID( str, i, 1 );
      IF c BETWEEN '0' AND '9' THEN 
        SET ret=CONCAT(ret,c);
      END IF;
      SET i = i + 1;
    END;
  UNTIL i > len END REPEAT;
  RETURN ret;
END |
DELIMITER ;

SELECT digits(cost) from Costdetails;

【讨论】:

有什么可能的方法,而不创建任何功能? 当您在答案底部以不同的边缘条件显示 select digits('junk in here 3000') 以证明这一点时,这真是太棒了 @Aashick 这基本上就是正则表达式:一只解决你困境的瘸腿龟。正则表达式的 O(n) 并不完全是猎豹。 see 函数是可靠的方法,但您也可以使用它:- SELECT cost FROM Costdetails WHERE cost REGEXP '^[0-9]+$';【参考方案2】:

您可以为此使用cast 函数,如下所示:-

SELECT cast('1000/-' as UNSIGNED)

【讨论】:

此方法仅在值以数字开头时有效。例如,适用于CAST('100/-')。但不适用于CAST('Rs. 1000/-')

以上是关于MySQL 如何从 varchar 列中获取精确的整数值的主要内容,如果未能解决你的问题,请参考以下文章

如何仅从日期时间列中获取日期? [复制]

如何从 MySQL 列中的 JSON 文档中获取最新值?

如何从 MySQL 列中缺失的有序值中获取最小值? [复制]

如果包含 json 文档作为字符串,如何从 MySQL(5.6) 列中获取值

无效的 XML 字符错误 - 如何从 VARCHAR2 数据库列中查找无效字符?

MySQL 从 INT 列中选择