什么是正则表达式转换"选择任何FROM" to" SELECT COUNT(*)FROM"?

时间:2017-05-23 03:25:47

标签: mysql sql regex

我基本上希望能够获取任何非嵌套的SQL字符串并将其转换为SQL以使用相同的正则表达式获取所有计数。

它必须能够匹配SELECT和FROM之间的任何东西并用count(*)替换,但我还没有分配经验值来升级我的正则表达式。

即。

SELECT col1, col2 FROM my_table where..."  to "SELECT count(*) FROM my_table where...

SELECT * FROM my_table where..."  to "SELECT count(*) FROM my_table where...

4 个答案:

答案 0 :(得分:3)

为什么不做呢

SELECT COUNT(*) from ( <insert original sql here> ) as X

答案 1 :(得分:0)

在MySQL中,您可以使用SQL_CALC_FOUND_ROWS,然后使用FOUND_ROWS()进行任何查询。所以:

SELECT SQL_CALC_FOUND_ROWS . . .
FROM . . .

然后获取行数:

SELECT FOUND_ROWS()

这是在documentation

中定义的

答案 2 :(得分:0)

对于正则表达式,您可以使用一个简单的演示here

基本上,我们用SELECT替换FROMCOUNT(*)之间的任何内容。细节也在链接处。

请注意,这将有助于您的思考,但无法进行深入测试。请自行进行一些测试。

您还可以使用该链接在Python,JavaScript等中生成代码。

编辑1:链接被封装为代码段,因此无效。删除了代码元标记。

答案 3 :(得分:0)

我总是相信,当你没有更简单或任何选择时,应该使用regex。在您的情况下,您可以使用简单的SQL逻辑而不是正则表达式来执行此操作。您可以按原样将原始查询传递给MySQL过程或其他任何操作并执行此操作:

set @inputQuery = 'SELECT col1, col2 FROM my_table where id = 1'; -- you will pass this

set @startIndex = locate('select', @inputQuery) + char_length(rtrim('select'));
set @endIndex = locate('where', @inputQuery);
set @subString = substring(@inputQuery, @startIndex, @endIndex - @startIndex);
set @finalQuery = replace(@inputQuery, @subString, ' count(*) ');

select @finalQuery;

输出:

SELECT count(*) where id = 1