数据
假设我在SQL中有一个由多行信息组成的字段,每个字段由i主题组成,每个主题由m个信息点组成。主题以“I”开头和信息的冲刺。它看起来像是:
________________________________________________
|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 现行制度
对于这些信息,我要做的是将每个主题解析到它自己的列中,然后取消这些列的旋转,并搜索包含给定关键字@关键字的主题。
目前,代码如下所示:
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)给出的位置。
我想做的是执行以下工作:
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]解释
如果我想要的东西不清楚,我会试着完成我想要完成的事情
我想输出一个包含包含关键字的主题的案例编号列表。对于列表中的每一种情况,我只想输出--那些包含关键字的主题。我希望允许报表的最终用户选择在每种情况下搜索多少个主题。当我不知道用户想要创建多少个主题时,我不想为每个主题创建一个列的表。
由于这些考虑,这似乎是一个循环是最好的选择,但在努力做到这一点有问题。
问题
Incorrect syntax near 'While'中使用循环。如果有任何方法(例如通过cte)来实现这些更改,我愿意听到它们!我主要是在研究如何使代码看起来不那么令人生畏(在我当前的cte中生成20个字段的20种情况看起来很可怕,然后需要3 cte才能正确地解除枢轴,移除满足某些条件的某些情况,并将其组合成一个可行的输出表)
提前感谢您阅读并帮助您!
发布于 2022-11-19 14:47:57
我觉得你工作太辛苦了。如果您只需要主题名称和数字,那么是否更容易将Information列拆分为换行符,然后收集以数字而不是“破折号”开头的所有行,那么您就会得到一个字符串列表,这些字符串看起来如下:
那么就很容易将行与关键字匹配吗?
类似于这种未经测试的SQL:
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来完成您的工作。
https://stackoverflow.com/questions/34140927
复制相似问题