可以在SQL语句中使用正则表达式来过滤字符串中的数字吗?

时间:2012-04-06 13:48:59

标签: php mysql sql

考虑以下“推文”(左)和“转推”(右)表:

  +----------+-----------------+     +----------+----+
  | tweet_id |  text           |     | tweet_id | rt |
  +----------+-----------------+     +----------+----+
  |  1       | foo {RT|123} bar|     |  1       | 123|
  |  2       | foobar          |     |  3       | 456|
  |  3       | {RT|456} baz    |     |  4       | 789|
  |  4       | bazbar {RT|789} |     +----------+----+
  |  5       | bar baz         |
  +----------+-----------------+

推文表包含数百万条预处理的推文。在一些推文中,添加了{RT | xx} 形式的自定义标签,xx为17到20的数字。转推表目前是空的,但需要按照所示进行填充:tweets.text应扫描{RT | xx}标签,如果找到,则应从标签中提取数字并将其插入转推表中tweet_id。

为此,我开始选择所有包含{RT} -labels的推文:

SELECT * FROM tweets WHERE `text` LIKE '%{RT|%'

第二步是在PHP中循环结果集并使用正则表达式从标签中过滤数字,然后执行INSERT INTO操作。然而,这需要花费很多时间 - 让我想知道使用SQL查询这可能会更快吗?如果是这样,查询将会是什么样子?我以前从未在SQL语句中使用正则表达式。

3 个答案:

答案 0 :(得分:1)

也许这样(未经测试);

SELECT SUBSTR(
    `text`,
    LOCATE('{RT|', `text`) + 4,
    LOCATE('}', `text`, LOCATE('{RT|', text) )
)
FROM `tweets`
WHERE `text` LIKE '%{RT|%';

答案 1 :(得分:1)

如果你的数据库是MySQL,你可以使用简单的查询来实现:

INSERT INTO `retweets` SELECT id, SUBSTR(`text`, LOCATE('{RT|', `text`)+4, LOCATE('}', `text`) - LOCATE('{RT|', `text`)-4) AS `num` FROM `tweets` HAVING `num` REGEXP '^[0-9]+$';

答案 2 :(得分:0)

这将在oracle中起作用:

SELECT tweet_id, REGEXP_SUBSTR(REGEXP_SUBSTR(text, '[{RT|][^}]+'), '[[:digit:]]+') FROM tweets WHERE text LIKE '%{RT|%'