如何检查SQL列是否有值?

时间:2016-08-23 08:28:22

标签: sql-server tsql

我使用Microsoft SQL Server 2012.我需要检查数据库中名为SiteObjects的表是否至少有一条记录,其中名为SiteRegionId的列的值等于{{1} }。

如果不是必须实现某种逻辑,如果不是必须实现另一种逻辑。

这是我的实施:

22

我认为这一行:

IF EXISTS (SELECT * FROM SiteObjects WHERE SiteRegionId = 22)
BEGIN
    ----do what you need if exists
    RETURN '0'; --not deleted
END
ELSE
BEGIN
    --do what needs to be done if not
    DELETE FROM SiteRegions 
    WHERE Id = 22;

    RETURN '1';
END

无效,因为我了解它在所有表行上运行并选择SELECT * FROM SiteObjects WHERE SiteRegionId = 22 等于22的所有行。有没有办法让它更有效?如果任何行符合条件,请继续。

3 个答案:

答案 0 :(得分:5)

不,EXISTS足够聪明,一旦观察到一行就会返回true。并且系统知道实际上没有检索到列数据。

回到90年代,一些优化器和数据库系统不够聪明,无法识别这种情况,但我不知道这些日子实际上会检索所有数据。 (当然,对于SQL Server系列,它在2000版本的产品之前修复了)

因此,其他答案中的建议是十多年前的遗留建议。

请参阅Subqueries with Exists

  

子查询实际上不会生成任何数据

     

...

     
      
  • EXISTS引入的子查询的选择列表几乎总是由星号(*)组成。没有理由列出列名,因为您只是测试是否存在满足子查询中指定条件的行。
  •   

答案 1 :(得分:1)

我建议你写一下:

IF EXISTS (SELECT 1 FROM SiteObjects WHERE SiteRegionId = 22)

您不需要使用*即,获取表的所有列以检查记录是否存在。您只需使用1

即可

然而,就效率而言,两个查询,即使用*的查询和使用1的查询在执行时将具有几乎相同的执行计划。通常1是首选,以使其更易于阅读。您可以按照此链接查看两个查询将如何提供相同的执行计划。 SQL SERVER – SELECT 1 vs SELECT * – An Interesting Observation

答案 2 :(得分:1)

如果您只是需要知道SiteRegionId = 22是否存在任何行,请将查询更改为SELECT TOP 1 id FROM SiteObjects WHERE SiteRegionId = 22

将id替换为索引列(主键列),这将告诉您是否有任何行,但是会通过从一行返回一列来实现。

TOP 1部分在找到1行后停止查询,因此无需查看整个表格。