从不规则格式的字符串中间返回号码(return numbers from the middle of

2019-10-17 04:25发布

我有一个包含所购产品的项目说明,MySQL数据库的字段。 其中有些是纯英文的说明,其它的是部件号,和其他人仍然有一部分数字后面的说明。 我已删除了所有的空格和破折号从字符串与替换()。

数据是这样的:

1938420985390asdfih
1234812934810dflkasd
asdfasldkjfaasdfjasd
asd;flkjaklsdf
adfsdf1234073927357sdapjfas
1/4sdikhsd 

我想回国:

1938420985390
1234812934810
(null)
(null)
1234073927357
(null)

我真正需要的是写一个SQL将返回的13位零件号,但没有多余的文字/字符。 我宁愿它返回的实际数量也一样,而不是1或0的匹配/不匹配。

我试图使用REGEXP函数(有人建议regexp ('\d{13}')regexp ('\p{13}')但这些并没有工作。[这些返回的0或1,而不是部分匹配的字符串。]有什么建议?

谢谢!

Answer 1:

这是MySQL中的不平凡的任务,还有用于返回正则表达式匹配没有内置函数。 但是,因为你正在寻找的正是13个数字,你可以做这样的事情(显然这向你需要检查的位置数...

-- setup test
CREATE TABLE t (foo VARCHAR(30));
INSERT INTO t VALUES 
('1938420985390asdfih')
,('1234812934810dflkasd')
,('asdfasldkjfaasdfjasd')
,('asd;flkjaklsdf')
,('adfsdf1234073927357sdapjfas')
,('1/4sdikhsd')


SELECT CASE
       WHEN SUBSTR(foo,1,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,1,13)
       WHEN SUBSTR(foo,2,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,2,13)
       WHEN SUBSTR(foo,3,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,3,13)
       WHEN SUBSTR(foo,4,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,4,13)
       WHEN SUBSTR(foo,5,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,5,13)
       WHEN SUBSTR(foo,6,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,6,13)
       WHEN SUBSTR(foo,7,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,7,13)
       WHEN SUBSTR(foo,8,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,8,13)
       WHEN SUBSTR(foo,9,13) REGEXP '^[0-9]{13}$' THEN SUBSTR(foo,9,13)
       END AS digits
  FROM t

-------------------
1938420985390
1234812934810
(NULL)
(NULL)
1234073927357
(NULL) 

不,这不是漂亮。 但是,你应该能够扩展,以有效地“扫描”合理长度的字符串。

注意:正则表达式被检查整个13字符子包括恰好13个字符,每个字符是否为十进制数字(0至9)。



Answer 2:

-让我们回到你的匹配值可能尚未在MySQL作为这里所描述的支持与正则表达式运算符MySQL的正则表达式 。 然而,由于在链接中提到,有一些你可以使用像这样的第三方库: UDF库为MySQL ,它允许你使用捕捉比赛PREG_CAPTURE

对于一些更多的信息,这个StackOverflow的链接似乎已经处理了这个问题。



Answer 3:

如果每个条目包含只有一个数字代码实例,然后这一个工程:

SELECT CASE WHEN LENGTH(firstNumber(foo)) > 3 THEN firstNumber(foo) ELSE '' END AS result
FROM t

值得一两点提:

  1. 数字长度必须至少一些长度,让我们说3位,以便我们能够避免像1的结果从行6“1 / 4sdikhsd”;
  2. 该功能firstNumber被修改为返回文本,但它几乎是相同的:

     DELIMITER // CREATE FUNCTION firstNumber(s TEXT) RETURNS TEXT COMMENT 'Returns the first integer found in a string' DETERMINISTIC BEGIN DECLARE token TEXT DEFAULT ''; DECLARE len INTEGER DEFAULT 0; DECLARE ind INTEGER DEFAULT 0; DECLARE thisChar CHAR(1) DEFAULT ' '; SET len = CHAR_LENGTH(s); SET ind = 1; WHILE ind <= len DO SET thisChar = SUBSTRING(s, ind, 1); IF (ORD(thisChar) >= 48 AND ORD(thisChar) <= 57) THEN SET token = CONCAT(token, thisChar); ELSEIF token <> '' THEN SET ind = len + 1; END IF; SET ind = ind + 1; END WHILE; IF token = '' THEN RETURN ''; END IF; RETURN token; END // DELIMITER ; 


Answer 4:

您正在寻找的功能是REGEXP_SUBSTR() :

SELECT REGEXP_SUBSTR(`dirty_value`,'[0-9]+') AS `clean_value` FROM `the_table`;

注:我测试和工程; 我使用的MySQL服务器V8.0(不知道它在以前的版本中工作)。

祝好运!



Answer 5:

而不是mysql ,你可以轻松地做到这一点grep在Linux命令

grep [0-9] foo.txt

然后创建表,并将其加载到MySQL。



文章来源: return numbers from the middle of a string with irregular format