标签: case

SQL Server CASE 语句是评估所有条件还是在第一个 TRUE 条件时退出?

SQL Server(特别是 2008 或 2012)CASE语句是评估所有WHEN条件还是在找到WHEN评估为真的子句后退出?如果它确实通过了整个条件集,这是否意味着最后一个条件评估为 true 会覆盖第一个评估为 true 的条件所做的事情?例如:

SELECT
    CASE
        WHEN 1+1 = 2 THEN'YES'
        WHEN 1+1 = 3 THEN 'NO'
        WHEN 1+1 = 2 THEN 'NO' 
    END
Run Code Online (Sandbox Code Playgroud)

结果是“YES”,即使最后一个 when 条件应该使它评估为“NO”。一旦找到第一个 TRUE 条件,它似乎就退出了。有人可以确认是否是这种情况

sql-server t-sql case

53
推荐指数
3
解决办法
11万
查看次数

如何将包含负值和零值的列的行相乘?

我正在尝试获取按查询分组的特定列的所有行的产品。我发现的大多数例子都指向组合exp,sumlog

exp(sum(log([Column A])))
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是该列包含一些值的零,因此当零传递给log函数时我收到此错误:

发生无效的浮点运算。

我以为我可以通过使用case表达式来解决这个问题,但这并不像我认为的那样工作,因为它似乎评估了所有情况......

select 
  Name,
  Product = case 
    when min([Value]) = 0 then 0 
    when min([Value]) <> 0 then exp(sum(log(I))) -- trying to get the product of all rows in this column
  end
 from ids
 group by Name
Run Code Online (Sandbox Code Playgroud)

SqlFiddle

给定以下结果集:

Id  Name  Value
_________________________________
1   a     1
2   a     2
3   b     0
4   b     1
Run Code Online (Sandbox Code Playgroud)

我希望得到以下行:

Name  Product
_____________
a     2
b     0
Run Code Online (Sandbox Code Playgroud)

所以总而言之......你如何乘以可以包含负数或零值的列中的行?

sql-server case sql-server-2014

10
推荐指数
1
解决办法
6234
查看次数

TSQL 查询中奇怪的条件语法:“&lt;=+” 它有什么作用?

我正在努力诊断 TSQL 中遗留查询的问题。查询中返回的列之一是:

CASE WHEN PaidDate >= '2021-01-01' AND PaidDate <=+'2021-10-31' THEN WO ELSE 0 END AS dYTDWO, 
Run Code Online (Sandbox Code Playgroud)

我以前没有见过“<=+”作为条件,并且在网上找不到任何对此的参考。

谁能对此做出解释?SSMS 对此非常满意,并且查询得以执行。

谢谢。

sql-server t-sql case

9
推荐指数
1
解决办法
1029
查看次数

CASE 语句中的空值

当我为 70-461 考试而学习时,我正在 SSMS 中玩弄一些东西以学习更多知识,但我遇到了一些问题。我正在尝试创建一个表来使用,因此我不必更改/删除 AdventureWorks 或 TSQL2012 数据库中任何已创建的表。在实际创建要使用的表之前,我创建了一个临时表来测试我的代码,这是我用来将值插入表中的代码:

DECLARE @i INT = 1
 WHILE @i < 10
    BEGIN
    INSERT INTO #TestEmployeeCountry 
    VALUES ( SUBSTRING('ABCDEFGHIJKLMNOP', @i, 1), 
        CASE (SELECT ABS(CHECKSUM(NEWID()))%10 +1)
            WHEN 1 THEN 'USA'
            WHEN 2 THEN 'CANADA'
            WHEN 3 THEN 'MEXICO'
            WHEN 4 THEN 'UK'
            WHEN 5 THEN 'FRANCE'
            WHEN 6 THEN 'SPAIN'
            WHEN 7 THEN 'RUSSIA'
            WHEN 8 THEN 'CHINA'
            WHEN 9 THEN 'JAPAN'
            WHEN 10 THEN 'INDIA'
        END)
    SET @i = @i + 1
    END;
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是我不断收到错误消息“无法将值 …

insert t-sql case checksum

8
推荐指数
1
解决办法
1753
查看次数

ORDER BY 项目必须出现在选择列表中 [...]

使用 Microsoft SQL Server 2008,我收到以下错误。


如果语句包含 UNION、INTERSECT 或 EXCEPT 运算符,则消息 104,级别 16,状态 1,第 43 行 ORDER BY 项必须出现在选择列表中。

我使用的查询有点复杂,但是子句CASE侧面的ORDER BY语句看不到别名列名,这里是一个简短的例子。

SELECT 1 AS foo, 2 AS bar
UNION ALL
SELECT 10 AS foo, 20 AS bar
ORDER BY CASE WHEN foo = 2 THEN 1 END;
Run Code Online (Sandbox Code Playgroud)

在我的生产查询中,左查询需要按[360_set]表中找到的列排序,右查询需要按[360_set]空排序。

如何修复此错误,为什么此语法会生成错误?

这是版本信息,

Microsoft SQL Server Management Studio     10.0.5512.0
Microsoft Analysis Services Client Tools   10.0.5500.0
Microsoft Data Access Components (MDAC)    6.1.7601.17514
Microsoft MSXML                            3.0 6.0 
Microsoft …
Run Code Online (Sandbox Code Playgroud)

sql-server order-by sql-server-2008-r2 case

7
推荐指数
1
解决办法
1万
查看次数

如何使用 case 语句选择数据并分组?

我试图通过使用 case 语句稍微操作数据,但似乎无法弄清楚。

Stops
--------------------
1Stop
1-Stop
1 stop
1 Stop
1stop
1 Stop
2-Stop
Run Code Online (Sandbox Code Playgroud)

我试图想出:

1-Stop.... 6
2-Stop.... 1
Run Code Online (Sandbox Code Playgroud)

我试过的是:

select CASE when 
Stops = '1Stop' OR 
Stops = '1 Stop' OR 
Stops = '1 stop' then '1-Stop' 
ELSE Stops END, count(*) 
from table group by Stops
Run Code Online (Sandbox Code Playgroud)

case

7
推荐指数
1
解决办法
10万
查看次数

提高 CASE 选择性能

我有以下查询,在少于 100K 行的数据集上运行最多需要 2 秒。

我的 SQL 非常生疏,但这看起来像是做的工作比它应该做的多。任何人都可以提供一些关于在哪里寻找加快速度的指示吗?

SELECT
    a.AddressID,
    IsPrincipal = CASE
    WHEN EXISTS(SELECT TOP 1 1 FROM dbo.Setting s WHERE s.SettingValue = a.AddressID AND s.SettingDefinitionID = 3 AND s.ProfileID = 1)
                THEN 1
                ELSE 0
            END,
    IsPickUp = CASE
                WHEN EXISTS(SELECT TOP 1 1 FROM dbo.AddressRole ar WHERE ar.AddressID = a.AddressID AND ar.[AddressRoleTypeID] = 2)
                THEN 1
                ELSE 0
            END,
    IsSender = CASE
                WHEN EXISTS(SELECT TOP 1 1 FROM dbo.AddressRole ar WHERE ar.AddressID = a.AddressID AND ar.[AddressRoleTypeID] = …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2008-r2 case query-performance

7
推荐指数
1
解决办法
4147
查看次数

从多个 CASE 匹配项上的匹配返回多行?

我想在我的查询中添加一列,该列将指定一行匹配的一个或多个类别。我想拿这个:

    +--------------+---------------+
Row | Product      | Quantity_Sold |
    +--------------+---------------+
1   | Coca-Cola    | 15            |
2   | Cigarettes   | 4             |
3   | Pretzel      | 6             |
4   | Beer         | 25            |
5   | Popcorn      | 10            |
6   | Candy Bar    | 10            |
    +--------------+---------------+
Run Code Online (Sandbox Code Playgroud)

并返回:

    +--------------+---------------+----------------------+
Row | Product      | Quantity_Sold | Category             |
    +--------------+---------------+----------------------+
1   | Coca-Cola    | 15            | Beverages            |
2   | Cigarettes   | 4             | Controlled Substance |
3   | Pretzel      | 6 …
Run Code Online (Sandbox Code Playgroud)

case

6
推荐指数
1
解决办法
4万
查看次数

总和案例当条款

我有以下查询,我希望老化配置文件显示为新列我的老化配置文件为 0-30、31-60、61-90、91-120、121-180、181-365、365+

我基本上希望结果出现在网络到期时出现在适当的老化支架中。

BU   0-30   31-60   61-90   91-120   121-180   181-365   365+
--------------------------------------------------------------
A    
B
C
Run Code Online (Sandbox Code Playgroud)

询问:

select
 BU,
 Ageing,
 sum(NetDue) as Netdue
 from [dbo].[vw_FACT_CONSOL_CREDITORS]
 where date = @date
 Group by BU, Ageing
Order by BU ;
Run Code Online (Sandbox Code Playgroud)

我是 SQL 的新手,只是想学习所以很抱歉,因为这是基本的东西谢谢

sql-server pivot case sql-server-2014 sum

6
推荐指数
1
解决办法
845
查看次数

可以使用 CASE 选择要 JOIN 的表吗?

我正在尝试使用 CASE 表达式来选择每行应与哪个表连接。

假设我的游戏中有一个 item_instances 表,其中包含游戏世界中的所有项目,其中一些项目是 item_templates 表中通用项目的千篇一律的副本,而其他项目则以模板开始,然后当玩家使用它们时获得独特的属性。它们现在存储在 unique_items 表中。

因此,当我在 item_instances 表中找到某个项目的记录时,我想查找有关它的更多信息,并且需要从正确的表中提取该信息。

这是我一直在尝试但没有成功的事情:

SELECT item_table, item_id, *
FROM item_instances AS ii
JOIN
CASE ii.item_table
    WHEN 0 THEN 'item_templates'
    WHEN 1 THEN 'unique_items'
    ELSE 'unique_items'
END
ON CASE = ii.item_id;
Run Code Online (Sandbox Code Playgroud)

如果有语法的快速修复,我很想听听。或者,如果这是您在概念上无法做到的事情 - 让每一行选择自己的连接 - 我很乐意获得更深入解释的链接。

过去,我通过执行两个 SELECT 来完成类似的操作,其中一个针对 item_templates 表,另一个针对 unique_items 表,并采用它们的 UNION。这感觉是一种更正确且更少浪费的方法。如果不是出于某种原因与 SQL 更深层次的架构有关,我想了解为什么。

postgresql join case

6
推荐指数
1
解决办法
9300
查看次数