Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 计算数字前的字符数_Mysql_Sql - Fatal编程技术网

Mysql 计算数字前的字符数

Mysql 计算数字前的字符数,mysql,sql,Mysql,Sql,在MySQL 5.6数据库中,我希望修剪字符串中第一个数字前空格后的所有内容,然后将结果插入到新表中。例如,SELECT id,strcolumn FROM sometable给出了以下值: 8976 complicated 200 some other info 8977 something else 400 even more info 8978 intricate 300 lots of extra characters 我希望新表将上述内容简化为: 8976

在MySQL 5.6数据库中,我希望修剪字符串中第一个数字前空格后的所有内容,然后将结果插入到新表中。例如,
SELECT id,strcolumn FROM sometable
给出了以下值:

8976    complicated 200 some other info
8977    something else 400 even more info
8978    intricate 300 lots of extra characters  
我希望新表将上述内容简化为:

8976    complicated
8977    something else
8978    intricate  
如何更改以下语句,使其创建新的已编辑表

CREATE TABLE newtablename AS SELECT id, strcolumn FROM sometable

在Java中,我会一次遍历字符串一个字符,寻找一个数值,然后从第一个数值的索引中减去1,并将字符串修剪到指定的索引处,从而获得100%的成功率。在MySQL中有什么方法可以做到这一点吗?

使用子字符串索引这是我写过的最难看的SQL:

这既丑陋又低效。MySQL可以使用正则表达式进行搜索,但不能返回基于正则表达式的子字符串。我确实建议使用UDF或客户端脚本,这可能是您可以使用的RE://([^0-9])\s[0-9]/或者至少创建一个函数来封装它


这个问题可能不是100%清楚,因为您应该指定,如果数字前面没有空格,或者是第一个字符,您希望得到什么结果。

因此,您只需要取一个字母数字混合的字符串,并将其修剪到数字之前的最后一个字符(听起来像是正则表达式的工作,尽管我自己还没有在mysql中使用过)@shaunhusain是的,这就是我想要的。但是,当我使用正则表达式时,我注意到它们有98%以上的匹配率。我的数据集有200000行,因此99.5%的匹配率会产生1000个错误,这是不可接受的。我想要100%的成功率。很抱歉,没有足够的SQL专家告诉你是否有,也许是因为你的更多合作伙伴mfortable在Java中您可以这样编写脚本,200000行实际上并没有那么大,所以用Java处理它应该不会花费太多时间。将数据导出(
SELECT…)到OUTFILE…
),用适当的编程语言处理它,然后重新导入(
LOAD data LOCAL infle
)。如果任务可能会定期重复,您还可以在程序中包含从/到db的数据处理。
CREATE TABLE sometable (id int primary key, strcolumn text);

INSERT INTO sometable VALUES (8976, 'complicated 200 some other info'), 
(8977, 'something else 400 even more info'), 
(8978, 'intricate 300 lots of extra characters ');

CREATE TABLE newtablename AS 
  SELECT id, 
         SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(
           strcolumn, 
           ' 1', 1), ' 2', 1), ' 3', 1), ' 4', 1), ' 5', 1), ' 6', 1), ' 7', 1), ' 8', 1), ' 9', 1), ' 0', 1) as strcolumn 
FROM sometable;