我有一个子查询,可以获取提交投诉的人的地址.此人可以拥有多个地址.我们以前只选择"OR"类型的地址,这样可以得到一个干净的子查询...
(SELECT TOP 1 Address FROM Address WHERE NameID = PersNameID AND AddressTypeCode = 'OR') AS ComplainantAddress
现在,输入地址的方式,它们可能有也可能没有"OR"类型的地址.它们可能只有"ML"类型或"BU"类型和"ML"类型的地址.
我需要获取为该人填充的第一个地址,以指定的顺序查找(按类型).我可以做一个巨大的CASE声明,但这是最好的方法吗?或者我应该使用ORDER By更改为JOIN并获取第一个非null值?
寻找建议.
你不必使用a CASE
,但你必须做类似的事情.这是一个使用的技巧CHARINDEX()
:
(SELECT TOP 1 Address FROM Address WHERE NameID = PersNameID ORDER BY CHARINDEX(AddressTypeCode, 'OR,ML,BU') )
如果您有其他代码并且首先不需要它们,那么:
(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'.字符串操作几乎适用于任何数据库(在函数名称中都有更改).