当前位置:  开发笔记 > 编程语言 > 正文

子选择条件

如何解决《子选择条件》经验,为你挑选了1个好方法。

我有一个子查询,可以获取提交投诉的人的地址.此人可以拥有多个地址.我们以前只选择"OR"类型的地址,这样可以得到一个干净的子查询...

(SELECT TOP 1 Address 
 FROM Address WHERE NameID = PersNameID AND AddressTypeCode = 'OR') AS ComplainantAddress

现在,输入地址的方式,它们可能有也可能没有"OR"类型的地址.它们可能只有"ML"类型或"BU"类型和"ML"类型的地址.

我需要获取为该人填充的第一个地址,以指定的顺序查找(按类型).我可以做一个巨大的CASE声明,但这是最好的方法吗?或者我应该使用ORDER By更改为JOIN并获取第一个非null值?

寻找建议.



1> Gordon Linof..:

你不必使用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'.字符串操作几乎适用于任何数据库(在函数名称中都有更改).

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有