将案例逻辑构建到 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 语句逻辑的最佳方法

将 20 GB csv 文件加载到 R 中的最佳方法是啥?

在星型模式 DWH 中构建无事实事实的最佳方法

将 ReactJS 构建/编译/部署到生产环境的最佳方法 [关闭]

将业务与表示逻辑分开的最佳方法?