将“SELECT What FROM”转换为“SELECT COUNT(*) FROM”的正则表达式是什么?

问题描述 投票:0回答:4

我基本上希望能够采用任何非嵌套 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...
mysql sql regex
4个回答
2
投票

为什么不直接做

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

-1
投票

对于正则表达式,您可以使用此处演示的简单正则表达式。

本质上,我们将

SELECT
FROM
之间的内容替换为
COUNT(*)
。详细信息也在链接中。

请注意,这将有助于您的思考,但尚未经过深入测试。请自行运行一些测试。

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

编辑 1:该链接作为代码片段附在其中,因此不起作用。删除了代码元标记。


-1
投票

我始终相信,当您没有更简单或根本没有任何选择时,应该使用

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

编辑

set @inputQuery = 'SELECT col1, col2 FROM my_table where id = 1'; 
set @startIndex = locate('select', @inputQuery) + char_length(rtrim('select'));
set @endIndex = locate('from', @inputQuery);
set @subString = substring(@inputQuery, @startIndex, @endIndex - @startIndex);
select replace(@inputQuery, @subString, ' count(*) ');

输出:

SELECT count(*) FROM my_table where id = 1

-2
投票

在 MySQL 中,您可以在任何查询中使用

SQL_CALC_FOUND_ROWS
,然后使用
FOUND_ROWS()
。 所以:

SELECT SQL_CALC_FOUND_ROWS . . .
FROM . . .

然后获取行数:

SELECT FOUND_ROWS()

这在文档中定义。

© www.soinside.com 2019 - 2024. All rights reserved.