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 条件,它似乎就退出了。有人可以确认是否是这种情况。
我正在尝试获取按查询分组的特定列的所有行的产品。我发现的大多数例子都指向组合exp,sum和log
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)
给定以下结果集:
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)
所以总而言之......你如何乘以可以包含负数或零值的列中的行?
我正在努力诊断 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 对此非常满意,并且查询得以执行。
谢谢。
当我为 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)
我遇到的问题是我不断收到错误消息“无法将值 …
使用 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) 我试图通过使用 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) 我有以下查询,在少于 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
我想在我的查询中添加一列,该列将指定一行匹配的一个或多个类别。我想拿这个:
+--------------+---------------+
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) 我有以下查询,我希望老化配置文件显示为新列我的老化配置文件为 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 的新手,只是想学习所以很抱歉,因为这是基本的东西谢谢
我正在尝试使用 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 更深层次的架构有关,我想了解为什么。
case ×10
sql-server ×6
t-sql ×3
checksum ×1
insert ×1
join ×1
order-by ×1
performance ×1
pivot ×1
postgresql ×1
sum ×1