Sql server 我如何在案例中使用此条件?
如果状态列=1,则我需要 检查另一个表中是否有行返回“Check”,如果没有行返回“in DB”Sql server 我如何在案例中使用此条件?,sql-server,tsql,sql-server-2005,Sql Server,Tsql,Sql Server 2005,如果状态列=1,则我需要 检查另一个表中是否有行返回“Check”,如果没有行返回“in DB” SELECT ID, UserName, CASE [Status] WHEN 1 THEN if ((Select Count(*) From Logs_TB Where Logs_TB.UserName = Users_TB.UserName) > 0) 'Check' Else 'In DB'
SELECT ID, UserName,
CASE [Status]
WHEN 1 THEN
if ((Select Count(*) From Logs_TB Where Logs_TB.UserName = Users_TB.UserName) > 0)
'Check'
Else
'In DB'
WHEN 2 THEN 'Revision'
WHEN 3 THEN 'Sent'
END AS StatusName
FROM Users_TB CROSS JOIN Logs_TB
编辑1:
我有两张桌子
在第一桌。
我希望得到[状态]列的以下结果
if FirstTable.ColumnStatus = 1
if SecondTable.ColumnA = FirstTable.ColumnB Has Rows
'Check'
else
'In DB'
else if FirstTable.ColumnStatus = 2
'Revision'
else if FirstTable.ColumnStatus = 3
'Sent'
编辑2
这是一个例子
我想从就业表中选择所有行
我想将列Status解析为列StatusName
如果Status=1,它有两个值
首先检查QualificationID和SpecializationID是否有行
在“空缺”表中,返回“支票”
如果“空缺”表中没有行,则返回“在DB中”
SELECT ID, UserName,
CASE [Status]
WHEN 1 THEN
if ((Select Count(*) From Logs_TB Where Logs_TB.UserName = Users_TB.UserName) > 0)
'Check'
Else
'In DB'
WHEN 2 THEN 'Revision'
WHEN 3 THEN 'Sent'
END AS StatusName
FROM Users_TB CROSS JOIN Logs_TB
如果状态=2“修订”
如果状态=3“已发送”您需要更改案例并添加更多条件:
SELECT ID, UserName,
CASE
WHEN [Status] = 1
AND EXISTS (SELECT 1
FROM Logs_TB
WHERE Logs_TB.UserName = Users_TB.UserName) THEN 'Check'
WHEN [Status] = 1 THEN 'In DB'
WHEN [Status] = 2 THEN 'Revision'
WHEN [Status] = 3 THEN 'Sent'
ELSE NULL
END AS StatusName
FROM Users_TB
CROSS JOIN Logs_TB
出于性能原因,最好使用EXISTS,而不是将计数与0进行比较。尝试此方法
DECLARE @Cnt INT
SELECT @Cnt = COUNT(*)
FROM Logs_TB
WHERE Logs_TB.UserName = Users_TB.UserName
SELECT
ID
,UserName
,CASE WHEN [Status] = 1
THEN
CASE WHEN @Cnt > 0
THEN 'Check'
ELSE 'In DB'
END
WHEN [Status] = 2 THEN 'Revision'
WHEN [Status] = 3 THEN 'Sent'
END AS StatusName
FROM Users_TB
CROSS JOIN Logs_TB
如果您使用的是2012+,请添加另一个嵌套案例或IIF。此外,存在最佳检查,而不是计数>0我想将此作为答案发布,但它将是注释。当[Status]=1且存在时,您需要更高级的case,而不是COUNT>0选择ID、用户名、case,当[Status]=1且存在时,从日志中选择1,其中Logs\u TB.UserName=Users\u TB.UserName,然后当[Status]=1时“检查”,然后当[Status]=2时“在DB中”,然后当[Status]时选择“修订”=3然后“发送”否则NULL END作为用户的StatusName\u TB交叉连接日志\u TBSo您需要case THEN。Martin Smith。。。我试着使用嵌套,但我不能正确地使用它。实际上,你能给我们展示完整的示例数据和期望的结果吗?两个表的交叉连接和涉及相同两个表的相关子查询在我看来很奇怪。也许有一种更简单的方法可以使用完全外部连接或其他什么。@RickySuhendar如果有帮助,请告诉我。如果您共享示例数据和所需的输出,那就太好了。我想检查每一行的条件,其中当前行的Logs\u TB.UserName=Users\u TB.UserName。。。请参见上文中的编辑2