Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL条件大小写_Sql_Sql Server_Tsql_Case_Distinct Values - Fatal编程技术网

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