将案例逻辑构建到 SQL 中的最佳方法
Posted
技术标签:
【中文标题】将案例逻辑构建到 SQL 中的最佳方法【英文标题】:Best way to build case logic into SQL 【发布时间】:2015-04-17 17:40:30 【问题描述】:我希望将一些逻辑构建到 SQL 视图中,但我不确定如何去做。基本上我有一个 SQL 视图,它需要查看[sender_city]
和[receiver_city]
来确定@987654323@。我认为这需要一个案例陈述??
我有一张表可以参考[Division]
:
[Location] [Division]
Location_1 Division_X
Location_2 Division_X
Location_3 Division_X
Location_4 Division_Y
Location_5 Division_Z
这是我描述所需逻辑的最佳尝试(sudocode):
If [sender_city] = [Location], then display [Division]
else if [receiver_city] = [Location], then display [Division]
else "Other Division"
我还需要构建一些逻辑,如果[sender_city]
和[receiver_city]
都引用了一个除法,它只需要使用[sender_city]
除法即可。
【问题讨论】:
【参考方案1】:您希望向 Division 表 LEFT JOIN 两次,一次用于发送方,一次用于接收方。 COALESCE 将返回第一个非空值,并且还将处理您的规则,即在确定划分时发送方优先于接收方。
SELECT COALESCE(d1.Division, d2.Division, 'Other Division') AS Division
FROM SomeTable st
LEFT JOIN Divsion d1
ON st.sender_city = d1.Location
LEFT JOIN Division d2
ON st.receiver_city = d2.location
【讨论】:
乔,这正是我想要的。我现在发现了第二个问题,它没有捕获所有发送者城市和接收者城市。例如,有些被列为“New York City NY”或“San Francisco CA”。它将这些位置归类为“其他部门”。有没有办法匹配这些实例? @user2860150 如果您的 Division 表中不存在这些确切值,则无法解决。 嗯好吧这不是一个大问题,但我们可以以某种方式合并一个 % 通配符吗?它在哪里找到以我的 SomeTable 中的匹配部分开头的位置? 您可以编写函数来比较您想要的尽可能多的法律变化中的名称。大多数 SQL 风格都规定了编写可以进行字符操作的用户定义函数。但是,如果不是“相同的字符串”,您将很快遇到有关定义什么构成“匹配”的复杂问题。直觉上,“纽约市”、“纽约”、“纽约市”和“大苹果”都是同一个地方。但除非你列出替代名称,否则计算机怎么会知道“NYC”代表“纽约市”而不是“Northern Yaron County”(一个真实的地方)? @Jay 感谢您的回复。我通过在我的 Division 表中定义这些实例来开发一种解决方法。我能够捕获所有这些实例,但我只需要每个月左右重新访问这个过程,以在我的表中定义我没有用我的数据集捕获的任何其他新实例。以上是关于将案例逻辑构建到 SQL 中的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
对于 asp.net mvc Web 应用程序,将文本文件存储到 Sql Server 数据库中的最佳方法是啥?
在 SQL Server 中执行嵌套 case 语句逻辑的最佳方法