如何仅从SELECT CASE查询返回一个结果?

时间:2019-07-13 01:46:05

标签: sql-server powershell

我有一个这样的桌子

DBName  p_server_fqdn   p_server_alias  q_server_fqdn   q_server_alias
cube1   server1.com p1server.com    server5.com q1server.com
cube1   server2.com p1server.com    server6.com q1server.com
cube2   server3.com p2server.com    server7.com q2server.com
cube2   server4.com p2server.com    server8.com q2server.com

我想运行一个案例选择查询,在该查询中,我获得了与服务器列匹配相应DBName的服务器输入的别名

这是我到目前为止正在尝试的

$SAlias = Invoke-sqlcmd -Query "SELECT DISTINCT CASE
                        WHEN ($cubeTable.DBName like $CUBE_input) AND ($cubeTable.p_server_fqdn) like $server_input THEN p_server_alias
                        WHEN ($cubeTable.DBName like $CUBE_input) AND ($cubeTable.q_server_fqdn) like $server_input THEN q_server_alias
                        ELSE 'unknown'
                        END as SAlias
                        FROM table $cubeTable" -ConnectionString "connectionstuff" | Select -ExpandProperty SAlias

但是当我在SSMS中尝试查询自身时(具有硬编码的值,例如cube1和server2.com),我返回了2行,其中与DBName不匹配的行为“未知”,而1行则显示p_server_alias

即时通讯结果

result

在这种情况下,我应该只回到第一行:p1server.com,所以为什么我也变得陌生?

1 个答案:

答案 0 :(得分:2)

set @cubeInput = 'cube1';
set @serverInput = 'server6.com';

select
    case when count(*) = 0 then 'UNKNOWN'
      when m.p_server_fqdn = @serverInput then m.p_server_alias 
         when m.q_server_fqdn = @serverInput then m.q_server_alias
    end as alias
from mytable m
where DBName = @cubeInput and (
  p_server_fqdn = @serverInput
  or q_server_fqdn = @serverInput
);

这是我的答案的实现:http://sqlfiddle.com/#!9/b967a22/61

@Cataster解决方案返回2行,因为实际上他获得了4行(3行为“ unkown”和1行为“ p1server.com”),然后在查询中进行了区分。使结果变成2行。

我的解决方案有点棘手:)。在查询中使用过滤器。比如果没有得到任何结果,则使用count函数。因此,我们得到1行,其值为0,而不是将其显示为“未知”。