【问题标题】:SQL Join help needed field type doesn't match for duration informationSQL 连接帮助所需的字段类型与持续时间信息不匹配
【发布时间】:2020-11-25 21:03:49
【问题描述】:

我正在尝试使用 SQL 连接两个表。我希望将表 2 中的成本添加到表 1。过去的成本仅因服务而异,因此它是一个简单的连接,但数据已更改,现在成本也因位置和持续时间而异。

我可以根据位置而不是持续时间进行链接。表 1 中的持续时间存储为整数。在表 2 中,持续时间以“xx-xxxx”格式存储为文本范围。我尝试使用 substring/left 和 patindex 隔离新字段中的最小持续时间和最大持续时间。 (我使用的是通过 dbeaver 访问的缓存数据库,但无法使用 charindex)。

我能够提取最短持续时间作为“-”字符之前的文本,但无法提取最长持续时间,即使我有它,我也不知道如何加入表格。请帮忙!另外由于正在使用数据库,我此时只能编写选择语句,不能创建/编辑表。谢谢!

表 1:

表 2:

期望的输出:

【问题讨论】:

  • 您需要在表 2 中拆分持续时间 col .. 这将为您提供更好的范围.. 因为我认为持续时间可以在值之间,即。 18
  • 您需要使用您正在使用的数据库标记问题。您还应该修复数据模型,因此它有两列用于范围而不是字符串。不要在字符串中存储数值!
  • 我同意数据模型很差,但它不在我的控制范围内。我正在访问缓存数据库的表格以获取电子健康记录。

标签: sql string inner-join dbeaver


【解决方案1】:

这是一个糟糕的设计。您不应该将数字范围存储为字符串。相反,您应该在两个不同的列中设置上限和下限。

您的数据存储方式,您需要拆分字符串并将每个部分转换为数字,您可以与第一个表中的值进行比较。所以:

select t1.*, t2.cost
from table1 t1
inner join table2 t2 
    on t2.duration between cast(substring(duration, 1, instr(duration, '-') - 1) as int) 
                       and cast(substring(duration, instr(duration, '-') + 1) as int)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多