Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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_Sql Server 2012 - Fatal编程技术网

Sql 带条件的子选择

Sql 带条件的子选择,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,我有一个子查询,用于获取投诉人的地址。此人可以有多个地址。我们过去只选择类型为“OR”的地址,这将生成一个干净的子查询 (SELECT TOP 1 Address FROM Address WHERE NameID = PersNameID AND AddressTypeCode = 'OR') AS ComplainantAddress 现在,按照地址的输入方式,它们可能有也可能没有“或”类型的地址。它们可能只有“ML”类型或“BU”和“ML”类型的地址 我需要获取为此人填充的第一个地址

我有一个子查询,用于获取投诉人的地址。此人可以有多个地址。我们过去只选择类型为“OR”的地址,这将生成一个干净的子查询

(SELECT TOP 1 Address 
 FROM Address WHERE NameID = PersNameID AND AddressTypeCode = 'OR') AS ComplainantAddress
现在,按照地址的输入方式,它们可能有也可能没有“或”类型的地址。它们可能只有“ML”类型或“BU”和“ML”类型的地址

我需要获取为此人填充的第一个地址,按指定顺序(按类型)查找。我可以做一个巨大的案例陈述,但这是最好的方式吗?或者我应该更改为具有ORDER By的联接并接受第一个非空值吗


寻找建议。

你不必使用
案例,但你必须做类似的事情。下面是一个使用CHARINDEX()的技巧:

如果您有其他代码,但不想先使用这些代码,则:

(SELECT TOP 1 Address 
 FROM Address
 WHERE NameID = PersNameID 
 ORDER BY (CASE WHEN AddressTypeCode IN ('OR', 'ML', 'BU')
                THEN 1 ELSE 2
           END),
          CHARINDEX(AddressTypeCode, 'OR,ML,BU')
) 
编辑:

我应该注意到,做同样的事情还有更深奥的方法:

(SELECT TOP 1 Address 
 FROM Address LEFT OUTER JOIN
      (VALUES ('OR', 1), ('ML', 2), ('BU', 3)
      ) codes(code, priority)
      ON Address.AddressTypeCode = codes.code
 WHERE NameID = PersNameID 
 ORDER BY COALESCE(codes.priority, 999999)
) 

这更像是SQL Server。字符串操作几乎可以在任何数据库上使用(函数名发生更改)。

如果您想对您的地址具有优先级,我建议您在数据库中捕获它。因此,假设您的
AddressTypes
表有一个
ComplaintPriority
列,那么您可以执行以下操作:

SELECT TOP 1
    A.Address
FROM
    Address A
INNER JOIN AddressTypes T ON T.AddressTypeCode = A.AddressTypeCode
WHERE
    A.NameID = PersNameID  -- Not sure where this is coming from
ORDER BY
    T.ComplaintPriority

如果我正在编写应用程序,我通常会这样做,只需添加一个排序列。但是,这是一个第三方应用程序,我必须运行一个SSRS报告查询。我会在这里留下我的答案,以防其他人有相同的问题没有这些限制,如果我能想出一个尚未提出的解决方案,我会添加它。是的,这看起来比我之前用几十个类型代码主演的案例陈述要干净得多。到目前为止,这看起来是可行的。
SELECT TOP 1
    A.Address
FROM
    Address A
INNER JOIN AddressTypes T ON T.AddressTypeCode = A.AddressTypeCode
WHERE
    A.NameID = PersNameID  -- Not sure where this is coming from
ORDER BY
    T.ComplaintPriority