SQL条件大小写
我有一个表,列出了项目和这些项目的状态。问题是某些项目有多个不同的状态条目。比如说SQL条件大小写,sql,sql-server,tsql,case,distinct-values,Sql,Sql Server,Tsql,Case,Distinct Values,我有一个表,列出了项目和这些项目的状态。问题是某些项目有多个不同的状态条目。比如说 HOST Status 1.1.1.1 PASS 1.1.1.1 FAIL 1.2.2.2 FAIL 1.2.3.3 PASS 1.4.2.1 FAIL 1.4.2.1 FAIL 1.1.4.4 NULL 我需要为每个资产返回一个状态 我一直在尝试使用T-SQL Case语句来实现这一点,但没有完全正确。 条件
HOST Status
1.1.1.1 PASS
1.1.1.1 FAIL
1.2.2.2 FAIL
1.2.3.3 PASS
1.4.2.1 FAIL
1.4.2.1 FAIL
1.1.4.4 NULL
我需要为每个资产返回一个状态
我一直在尝试使用T-SQL Case语句来实现这一点,但没有完全正确。
条件是任何通过+任何东西都是通过,失败+无结果是失败,Null是无结果。尝试使用
case
语句转换为有序结果并分组,最后,您需要转换回良好的、人类可读的答案:
with cte1 as (
SELECT HOST,
[statNum] = case
when Status like 'PASS' then 2
when Status like 'FAIL' then 1
else 0
end
FROM table
)
SELECT HOST, case max(statNum) when 2 then 'PASS' when 1 then 'FAIL' else 'No Results' end
FROM cte1
GROUP BY HOST
注意:我使用了一个CTE语句,希望能让事情变得更清楚一些,但一切都可以在一个SELECT
中完成,如下所示:
SELECT HOST,
[Status] = case max(case when Status like 'PASS' then 2 when Status like 'FAIL' then 1 else 0 end)
when 2 then 'PASS'
when 1 then 'FAIL'
else 'No Result'
end
FROM table
您可以将Max(Status)
与groupby Host
一起使用,以获得Distinct
值:
Select host, coalesce(Max(status),'No results') status
From Table1
Group by host
Order by host
| HOST | STATUS |
|---------|------------|
| 1.1.1.1 | PASS |
| 1.1.4.4 | No results |
| 1.2.2.2 | FAIL |
| 1.2.3.3 | PASS |
| 1.4.2.1 | FAIL |
默认情况下,SQL Server不区分大小写,如果您的服务器需要区分大小写,请使用lower()函数,如下所示:
Select host, coalesce(Max(Lower(status)),'No results') status
From Table1
Group by host
Order by host
那么规则是什么,为什么希望通过1.1.1.1而不是失败。请不要说是第一列,除非您有其他列指示它们的顺序。如果有状态日期,并且规则使用最新的,则您根本不需要输入大小写。我会将状态存储为数字(如1或0表示通过/失败)然后在主机上进行分组,对状态进行求和,然后对该求和进行案例逻辑…嗯,刚刚注意到您将规则放入了,等等。这是一个来自系统的身份验证报告,该系统尝试不同的身份验证方法,而不考虑操作系统。对于1.1.1.1,Windows身份验证已通过,但Unix失败@托尼·霍普金森小心点!尽管
“FAIL”<“PASS”
,但通常“PASS”<“FAIL”
(注意字符的大小写)@chezy525:默认情况下,SQL Server不区分大小写。还可以使用Lower()
和Upper()
函数处理区分大小写的问题。用法类似于coalesce(Max(Lower(status)),'No results')
。或者,您可以在聚合函数中强制排序:Max(status COLLATE Latin1\u General\u CI\u AI)
。。。我不知道哪一个更有效…使用相同的查询可以嵌套CAST语句。我有一个“排除”表,我也需要考虑。第一个强制转换是将匹配主机的状态设置为排除,然后对不匹配的主机执行此查询exclusion@EddieD,我不确定您到底想做什么,但一般来说,您可以嵌套cast
语句(和case
语句,如果您的意思是这样的话)。所以,试一试,如果你碰到另一面墙,把所有的东西放在一起,你总是可以问另一个问题!
| HOST | STATUS |
|---------|------------|
| 1.1.1.1 | PASS |
| 1.1.4.4 | No results |
| 1.2.2.2 | FAIL |
| 1.2.3.3 | PASS |
| 1.4.2.1 | FAIL |
WITH CTE( HOST, STATUSValue)
AS(
SELECT HOST,
CASE STATUS WHEN 'PASS' 1 ELSE 0 END AS StatusValue
FROM Data
)
SELECT DISTINCT HOST,
CASE ISNULL(GOOD.STATUSVALUE,-1) WHEN 1 THEN 'Pass'
ELSE CASE ISNULL( BAD.STATUSVALUE,-1) WHEN 0 Then 'Fail' Else 'No Results' END
END AS Results
FROM DATA AS D
LEFT JOIN CTE AS GOOD
ON GOOD.HOST = D.HOST
AND GOOD.STATUSVALUE = 1
LEFT JOIN CTE AS BAD
ON BAD.HOST = BAD.HOST
AND BAD.STATUSVALUE = 0