首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANSI Sql查询强制返回0条记录

ANSI Sql查询强制返回0条记录
EN

Stack Overflow用户
提问于 2009-12-18 04:27:05
回答 5查看 1.1K关注 0票数 5

我正在寻找一个ANSI-SQL方法来执行一个Select查询,而不返回任何记录,但是填充一个TDataSet的Fields结构。

我找到的方法是在任何查询中添加"where 1=0“,例如:

代码语言:javascript
复制
Select Id, name, province
from customers
where 1=0

这是一个相当简单的例子,当我必须处理用户输入的查询,然后解析它们,如果where子句已经存在,则删除where子句,并替换为"1=0“时,它会变得有点复杂。

如果用户输入的查询中的最后一个子句是where子句,那么根本没有问题,但是对于更复杂的查询,比如:

代码语言:javascript
复制
select
  c.lastname,
  sum(cs.amount)
from customersales cs
join customers c on c.idcustomer=cs.idcustomer
/* where 1=0 */
group by c.idcustomer, c.lastname

通过使用"where SQL“方法,在前面的示例中插入它的唯一方法是使用一个功能相当强大的1=0解析器(请记住,用户可以输入复杂的查询,包括子查询等等),解析器可以知道在哪里包含这个字符串。

有没有人知道更好的方法呢?我不能使用"limit 1“,因为它必须是ANSI方式。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-12-18 04:35:18

如何在用户的SELECT周围添加您自己的SELECT?

代码语言:javascript
复制
SELECT * FROM (
select
  c.lastname,
  sum(cs.amount)
from customersales cs
join customers c on c.idcustomer=cs.idcustomer
/* where 1=0 */
group by c.idcustomer, c.lastname
) x
WHERE 0=1

EDIT: ORDER BY不适用于该解决方案,但是由于您没有得到任何行,因此可以在必要时尝试将其从查询中删除。

票数 11
EN

Stack Overflow用户

发布于 2009-12-18 05:25:11

供将来参考,以防人们最终有不同的目标:请注意,使WHERE子句成为矛盾可能会导致优化器决定根本不执行子计划。因此,如果您需要查询的一些副作用(可能是预热缓存、执行过程等等),请注意。:-)

票数 0
EN

Stack Overflow用户

发布于 2009-12-18 05:25:16

如果您使用的是MSSQL Server,那么您可以将查询包含在SET FMTONLY

代码语言:javascript
复制
SET FMTONLY ON SELECT * FROM tablename SET FMTONLY OFF
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1924335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档