首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试图在Server 2012的情况下在select语句中运行while循环

问试图在Server 2012的情况下在select语句中运行while循环
EN

Stack Overflow用户
提问于 2015-12-07 18:48:37
回答 1查看 74关注 0票数 3

数据

假设我在SQL中有一个由多行信息组成的字段,每个字段由i主题组成,每个主题由m个信息点组成。主题以“I”开头和信息的冲刺。它看起来像是:

代码语言:javascript
复制
________________________________________________
|Number | Information                           
|===============================================
|1      | 1. Topic 1.1                           
|       |     -Info 1.1.1                       
|       |     - ... [more info]
|       | 2. Topic 1.2
|       |     -Info 1.2.1
|       |     - ...[more info]
|       | ... [more topics]
|_______|_____________________________
|2      | 1. Topic 2.1
|....and so on  

现行制度

对于这些信息,我要做的是将每个主题解析到它自己的列中,然后取消这些列的旋转,并搜索包含给定关键字@关键字的主题。

目前,代码如下所示:

代码语言:javascript
复制
Select 
    Number
    ,Case When Information LIKE '%1. %2. %'
          Then substring (Information, charindex('1.',Information),
                    charindex('2.', Information) -(charindex('1.',Information)+2) )
     Else Information
     End as [Topic1]
    ,Case When Information LIKE '%2. %3. %'
           Then substring (Information, charindex('2.',Information),
                    charindex('3.', Information) -(charindex('2.',Information)+2) )
     Else 'N/A'
     End as [Topic2]
     ...repeat 2nd case for each set of numbers up to  '%20. %21. %'

第一个不一样的唯一原因是,如果它不匹配模式,那么我想抓取整个字段,这样我就不会错过任何东西。然后,我将刚才创建的主题字段unpivot为一般的[Topic]字段,然后使用WHERE [Topic] LIKE '%' +@keyword+'%'提取任何特定的主题及其相关的大小写作为我的最后一个表输出。这些案例可以包含从1到40+主题之间的任何地方,每个主题有1-7个附加信息字段。

期望的修改

注意:为了使代码更容易阅读,我不会用正确的语法编写我的子字符串代码,而是选择写substring(Information,ci(@Iter), ci(@Iter+1)-ci(@Iter))来表示从‘(Iter)’指定的位置运行的子字符串。(iter+1)给出的位置。

我想做的是执行以下工作:

代码语言:javascript
复制
  Declare @Iter smallint
  Declare @Result varchar(max)

  Select
      Number
      , Set @Iter=1
        Set @Result = ' '
        Case When Information LIKE '%'+@keyword+'%' --keyword chosen at front end
             Then While @Iter < @n --@n set by the user from front end
                  Begin
                  Case When Information LIKE '%' + cast(@Iter as varchar(5))
                        + '. %'+cast((@Iter+1) as varchar(5))+'. %' 
                        and substring(Information,ci(@Iter), ci(@Iter+1)-ci(@Iter) )
                        LIKE '%'+@keyword+'%' 
                        Then  Set @Result = @Result +substring(Information,ci(@Iter), 
                                ci(@Iter+1)-ci(@Iter) )
                  Else Set @Result = @Result end
             Set @Iter = @Iter +1
             End
       Else ' ' end [Result]

解释

如果我想要的东西不清楚,我会试着完成我想要完成的事情

我想输出一个包含包含关键字的主题的案例编号列表。对于列表中的每一种情况,我只想输出--那些包含关键字的主题。我希望允许报表的最终用户选择在每种情况下搜索多少个主题。当我不知道用户想要创建多少个主题时,我不想为每个主题创建一个列的表。

由于这些考虑,这似乎是一个循环是最好的选择,但在努力做到这一点有问题。

问题

  1. server不允许我在Select语句-Incorrect syntax near 'While'中使用循环。
  2. 信息来源的地方禁止将我正在搜索的表中的信息标准化
  3. 即使没有,我也被禁止在工作中创建自己的永久表,因此我无法对所有传入数据进行规范化处理。
  4. 我也不允许写我自己的存储过程。

如果有任何方法(例如通过cte)来实现这些更改,我愿意听到它们!我主要是在研究如何使代码看起来不那么令人生畏(在我当前的cte中生成20个字段的20种情况看起来很可怕,然后需要3 cte才能正确地解除枢轴,移除满足某些条件的某些情况,并将其组合成一个可行的输出表)

提前感谢您阅读并帮助您!

EN

回答 1

Stack Overflow用户

发布于 2022-11-19 14:47:57

我觉得你工作太辛苦了。如果您只需要主题名称和数字,那么是否更容易将Information列拆分为换行符,然后收集以数字而不是“破折号”开头的所有行,那么您就会得到一个字符串列表,这些字符串看起来如下:

  1. 专题1.1
  2. 专题2.1

那么就很容易将行与关键字匹配吗?

类似于这种未经测试的SQL:

代码语言:javascript
复制
select SUBSTRING(s.value,1, PATINDEX('% %', s.Value) - 1) AS topicId
, SUBSTRING(s.Value, PATINDEX('% %', s.Value), LENGTH(s.Value)) AS topicText
from [table that would make Codd cry] t
cross apply STRING_SPLIT(t.Information, CHAR(13)) s
where s.Value LIKE '[0-9]%' -- Starts with a number
AND s.Value LIKE @keywords --matches keywords

不确定您是否可以创建函数,或者您的Server版本中有可用的STRING_SPLIT,但是如果没有,您可以在网络上找到一些字符串拆分CTE来完成您的工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34140927

复制
相关文章

相似问题

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