我有一个包含所购产品的项目说明,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,而不是部分匹配的字符串。]有什么建议?
谢谢!
这是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)。
-让我们回到你的匹配值可能尚未在MySQL作为这里所描述的支持与正则表达式运算符MySQL的正则表达式 。 然而,由于在链接中提到,有一些你可以使用像这样的第三方库: UDF库为MySQL ,它允许你使用捕捉比赛PREG_CAPTURE
。
对于一些更多的信息,这个StackOverflow的链接似乎已经处理了这个问题。
如果每个条目包含只有一个数字代码实例,然后这一个工程:
SELECT CASE WHEN LENGTH(firstNumber(foo)) > 3 THEN firstNumber(foo) ELSE '' END AS result
FROM t
值得一两点提:
- 数字长度必须至少一些长度,让我们说3位,以便我们能够避免像1的结果从行6“1 / 4sdikhsd”;
该功能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 ;
您正在寻找的功能是REGEXP_SUBSTR() :
SELECT REGEXP_SUBSTR(`dirty_value`,'[0-9]+') AS `clean_value` FROM `the_table`;
注:我测试和工程; 我使用的MySQL服务器V8.0(不知道它在以前的版本中工作)。
祝好运!
而不是mysql
,你可以轻松地做到这一点grep
在Linux命令
grep [0-9] foo.txt
然后创建表,并将其加载到MySQL。