【问题标题】:Comparison operator in count() is not workingcount() 中的比较运算符不起作用
【发布时间】:2019-11-14 03:57:58
【问题描述】:
SELECT 15 > 14 FROM Duel;

这段代码 sn-p 在 MySql 中有效,但在 SQL Server 中无效:

SQL 错误 (102): '>' 附近的语法不正确

我有一个要求,我想查看是否存在至少 1 条记录返回 1 或 0

SELECT count(emp.name) > 0
FROM ****
WHERE *** IN (***)

检查 db fiddle https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=348709a562ad02cbe88abf01a37229f1

【问题讨论】:

  • 您可以使用 IF EXISTS 而不是获取计数并与 0 进行比较
  • 这个我最终使用了 SELECT IIF(count(erm.employee_code) > 0, 1, 0) FROM **** WHERE *** IN (***)
  • “决斗”?不,它可能在 MySQL 中不起作用。
  • 我想提及的随机表名

标签: sql sql-server sql-server-2017


【解决方案1】:

我想你在找having

 SELECT 1 from new_table_name
   having count(empName)>0

更新

您可以使用SIGN()。当结果为正时返回1,当结果为0时返回0

SELECT SIGN(COUNT(*)) FROM new_table_name

Check fiddle here

【讨论】:

  • 您仍然需要考虑问题的“else 0”部分。如果不满足谓词,则结果集为空。
  • @JorgeGarcia,啊!我没有注意到else 部分。更新了更简单的表格
【解决方案2】:

试试case 声明-

select case when count(emp.name) > 0 then 1 else 0 end
from ****
where *** IN (***)

【讨论】:

  • case 正在工作,但我可以在没有 cca​​se 的情况下在 1 行中完成
【解决方案3】:

你可以试试 EXISTS 子句

IF EXISTS (SELECT 1 emp.name
        FROM ****
        WHERE *** IN (***))
BEGIN
    SELECT 1
END
ELSE
    SELECT 0
END 

由于要返回 1 或 0,您需要在 CASE 语句中定义值。

select case when exists(SELECT emp.name
            FROM ****
            WHERE *** IN (***)) then 1 else 0 end

【讨论】:

    【解决方案4】:

    不要使用 COUNT。您不想计算行数,只是想看看是否有行。并且不要使用 IF 之类的逻辑,只需使用 CASE。

    SELECT CASE WHEN EXISTS (SELECT 1 FROM **** WHERE **** IN (****)) 
                THEN 1
                ELSE 0
           END;
    

    【讨论】:

      【解决方案5】:

      您可能希望使用这样的 CTE:

      WITH T (C)
      AS  
      -- Select the first record with a value in emp.name
      (  
          SELECT TOP 1 1
          FROM **** emp
          WHERE *** IN (***)
          AND emp.name IS NOT NULL
      )
      -- just count the elements of T
      SELECT COUNT(1) FROM T
      

      https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=3514827fadaf6b8d19c2658008df0a99


      如果您更喜欢单行解决方案而不必对所有记录进行计数,这里是另一种选择:

      SELECT IIF(exists(select TOP 1 1 from **** emp where emp.name IS NOT NULL), 1, 0)
      

      https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=be6c753a6ddb164524576061c3b8802e

      【讨论】:

        【解决方案6】:

        提供的所有答案都可以正常工作。但是SQL Server已经提供了比较功能。

        SELECT IIF(count(erm.employee_code) > 0, 1, 0) 
        FROM **** 
        WHERE *** IN (***)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多