Sql 带条件的子选择
我有一个子查询,用于获取投诉人的地址。此人可以有多个地址。我们过去只选择类型为“OR”的地址,这将生成一个干净的子查询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”类型的地址 我需要获取为此人填充的第一个地址
(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