【问题标题】:SELECT EXISTS in Sybase在 Sybase 中选择 EXISTS
【发布时间】:2017-06-13 09:04:01
【问题描述】:

我在 PostgreSQL 中有以下查询(1=1 是一些任意条件的占位符,因为显然我不能在 Sybase 中写 WHERE TRUE

SELECT EXISTS FROM (
    SELECT 1 FROM someTable WHERE 1=1  
)

如何将它们转换为 SQL Server/Sybase 语法? 一个迂回的方法是这样做:

SELECT COUNT(*) FROM (
    SELECT 1 FROM someTable WHERE 1=1  
) a

… 可以进一步简化为:

SELECT COUNT(*) FROM someTable WHERE 1=1  

...但是EXISTS 更干净,我相信它也符合 ANSI 标准。

【问题讨论】:

  • 这个查询应该做什么?
  • 在 TSQL 中,where 1=1 完全没有做任何事情。你加入它是为了什么?
  • @TimSchmelter 返回 TRUE 或 FALSE,具体取决于表 someTable 中是否存在满足任意条件的行(1=1 是占位符)。

标签: sql-server sybase sap-ase


【解决方案1】:

exists() 没有返回您可以选择的值(我不知道为什么)。您可以查看if exists(),但不能查看select exists()。您也可以查看where exists() 甚至case when exists()

select 
    E = case 
        when exists(
          select 1 from master..spt_values
        ) 
          then 1
        else 0 
        end

如果您尝试获取多个不同条件的计数,sql server 的常见模式如下:

select 
    ACount     = sum(case when x='A' then 1 else 0 end)
  , ABCount    = sum(case when x in ('A','B') then 1 else 0 end)
  , TotalCount = count(*) /* or sum(1) */ 
from someTable

【讨论】:

    【解决方案2】:

    不确定您对“EXISTS”的期望,但这可能会奏效

    SELECT 1 
    WHERE EXISTS (SELECT 1 FROM dbo.Table WHERE 1 = 1)
    

    【讨论】:

    • 如果条件不成立,这将返回一个空结果集。不保证返回 TRUE/FALSE。
    • 这就是为什么我在评论中问我不确定存在应该做什么。我可以编辑我的分析器,但下面的答案解决了问题。
    【解决方案3】:

    试试这个:

    SELECT IIF(EXISTS (SELECT 1 FROM mytable WHERE 1=1), 1, 0)
    

    【讨论】:

    • [代码:156,SQL 状态:S1000] 关键字“EXISTS”附近的语法不正确。
    • @MarcusJuniusBrutus 此查询从 SQL Server 2012 开始运行。你用的是哪个版本?
    • 是的,我应该在评论中提到这一点。我在 Sybase ASE 15.7 上运行它
    猜你喜欢
    • 2011-10-11
    • 2014-02-03
    • 2014-02-05
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多