【问题标题】:adding trimmed substrings添加修剪的子字符串
【发布时间】:2021-06-25 10:21:33
【问题描述】:

使用 sql 服务器:

我有许多修剪 txt 文件的命令,例如:

Case when charindex('-', Substring([RawStreamOut], 179, 10)) > 0   
                then '-' + Replace(LTrim(RTRIM(Substring([RawStreamOut], 179, 9))), ',','')  else
                        LTrim(RTRIM(Substring([RawStreamOut], 179, 10))) end as [Days_Old_16_To_20],

Case when charindex('-', Substring([RawStreamOut], 196, 10)) > 0   
                then '-' + Replace(LTrim(RTRIM(Substring([RawStreamOut], 196, 9))), ',','')  else
                        LTrim(RTRIM(Substring([RawStreamOut], 196, 10))) end as [Days_Old_21_To_40]

等等……

我有很多这样的。

当前输出:

我需要能够将这些命令的结果添加到名为“total”的新列中。有没有简单的方法可以做到这一点?

【问题讨论】:

  • 这是什么关系型数据库? SQL 服务器?请edit您的问题并添加适当的标签!请添加一些示例数据和一些示例输出,甚至更好的是minimal reproducible example 以及示例数据。
  • 嗨,奥卡索,谢谢。我已经根据你的 cmets 更新了它
  • 共享样本数据和输出而不是图像。
  • “我如何共享样本数据?” 最好作为DDL和DML语句;然后我们可以将 SQL 复制并粘贴到我们的 RDBMS 中并获取数据。如果不是格式正确表格text.
  • 您不能在同一个 SELECT,不,@d_chawke 中通过别名引用列,但这不是子查询/CTE 的问题。实际上有 1,000 个(如果不是 10,000 个甚至 100,000 个或更多)示例向您展示如何使用 CTE/子查询。

标签: sql sql-server substring substr charindex


【解决方案1】:

你现在拥有的是:

select 
    case when charindex........as [Days_Old_16_To_20]
    ,.......
from
    (bunch of tables and joins)

相反,请将您的公式放在交叉应用中:

select
    q.*
from 
    (bunch of tables and joins)
    cross apply
    ( select
        case when charindex........as [Days_Old_16_To_20]
        ,.......
    ) as q

现在您可以在您的选择中添加一个新列:

select
    q.[Days_Old_16_To_20] + q.[Days_Old_21_To_40] + .... as [Total_value]
    ,q.*
from 
    (bunch of tables and joins)
    cross apply
    ( select
        case when charindex........as [Days_Old_16_To_20]
        ,.......
    ) as q

【讨论】:

    【解决方案2】:

    一种简单的方法是使用view

    创建视图 SomeView 为

    select...
    Case when charindex('-', Substring([RawStreamOut], 179, 10)) ..... end as [Days_Old_16_To_20],
    Case when charindex('-', Substring([RawStreamOut], 196, 10)) ..... end as [Days_Old_21_To_40]
    .
    .
    from <tables>
    

    那么你的查询可以很简单

    select 
        column, 
        [Days_Old_16_To_20] + [Days_Old_21_To_40] +... as total_Value
    from someView
    

    【讨论】:

    • 感谢 Stu,这也适用于 George,如果我能同时接受这两个答案,我会的! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多