首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从输入字符串派生日期和速率的查询。

从输入字符串派生日期和速率的查询。
EN

Stack Overflow用户
提问于 2022-02-18 05:54:05
回答 2查看 67关注 0票数 -2

在SQL server中,我需要从给定的输入导出日期和速率。日期将在5之后;速率将在3之后;可以在同一输入中提供多个日期记录和速率记录(将结果中带有逗号的记录连在一起)。

它有两排。第一次有单一日期和比率。第二个有多个日期和费率。在输入字符串中可能有n个日期和速率。请建议和一个简单的SQL查询来派生相同的内容。我只使用2012,所以我不能使用最新的函数。

输入(2行):

代码语言:javascript
运行
复制
;2;1;2;5;20270608;3;100.000000;
;2;203;2;5;19680515;3;100.000000;5;19690515;3;100.000000;5;19700515;3;100.000000;5;19710515;3;100.000000;5;19720515;3;100.000000;

输出日期(2行):

代码语言:javascript
运行
复制
20270608
19680515,19690515,19700515,19710515,19720515

产出率(2行):

代码语言:javascript
运行
复制
100.000000
100.000000,100.000000,100.000000,100.000000,100.000000
EN

回答 2

Stack Overflow用户

发布于 2022-02-18 07:46:36

正如@JamesZ在注释中已经说过的,您可以使用函数来完成这一任务。

代码语言:javascript
运行
复制
declare @test varchar(1000) = ';2;203;2;5;19680515;3;100.000000;5;19690515;3;100.000000;5;19700515;3;100.000000;5;19710515;3;100.000000;5;19720515;3;100.000000;'

select string_agg(t2.nextvalue, ',')
from   ( select t.value,
                lead(value, 1) over (order by one) nextvalue
         from   ( select '1' as one,
                         value
                  from   STRING_SPLIT(@test ,';')
                  where value is not null
                  and   value <> ''
                ) t
      ) t2
where t2.value = '5'

结果是

代码语言:javascript
运行
复制
19680515,19690515,19700515,19710515,19720515

想要得到这个价格就这么做吧

代码语言:javascript
运行
复制
where t2.value = '3'

你自己试试吧,在这个DBFiddle中

编辑

由于sql server 2012没有split_string函数,所以可以使用DelimitedSplit8K函数。

由于它也没有string_agg函数,所以我们必须使用xml来代替

然后我们使用材料在开始时去掉额外的,

代码语言:javascript
运行
复制
select stuff ( ( select ',' + t2.nextvalue
                 from   ( select t.item,
                                 lead(item, 1) over (order by one) nextvalue
                          from   ( select '1' as one,
                                          item
                                   from   DelimitedSplit8K(@test, ';')
                                   where item is not null
                                   and   item <> ''
                                 ) t
                        ) t2
                where t2.item = '5'
                for XML PATH('')
               ), 
               1, 1, ''
             ) as dates

新DBFiddle

票数 1
EN

Stack Overflow用户

发布于 2022-02-21 13:49:33

谢谢你的回复。我稍微更改了@GuidoG中的响应,编写了查询,而没有使用如下函数,

代码语言:javascript
运行
复制
SELECT 
  string_agg(t2.nextvalue, ',') 
FROM 
  (
    SELECT 
      t.item, 
      Lead(item, 1) OVER (
        ORDER BY 
          one
      ) nextvalue 
    from 
      (
        SELECT 
          '1' AS one, 
          item 
        from 
          (
            SELECT 
              split.a.value('.', 'VARCHAR(100)') AS item 
            from 
              (
                SELECT 
                  cast (
                    '<m>' + replace(@test, ';', '</m><m>') + '</m>' as xml
                  ) as data
              ) AS x cross apply data.nodes ('/M') AS split(a)
          ) AS i 
        where 
          item IS NOT null 
          and item <> ''
      ) t
  ) t2 
where 
  t2.item = '5'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71168963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档