以字符串形式返回子字符串的所有结果

时间:2012-04-27 17:40:56

标签: sql sql-server-2008

我在供应商数据库中有一些奇怪的数据,但需要能够从数据库中的一个字段中提取多个不同的参数。

所以从这个例子中我想拉出所有介于两者之间的项目(“%”)

引号之间是一个字符串,不管它看起来像代码:

“Func_GetParameterLatestValue(”IBW Patient Height RT Assess“)kHeight = Func_GetParameterLatestValue(”IBW Vent Misc的高度“)If(kSex)=”“然后
Return_Value = NULL否则如果kHeight> 0然后如果kSex = 1那么Return_Value = Round(((kHeight - 152.4)* .91)+50,0)否则
Return_Value = Round(((kHeight - 152.4)* .91)+45.5,0)结束IF Else Return_Value = NULL结束IF结束IF'Return_Value = kHeight'(“IBW患者身高RT评估”)“

所以返回值为:

IBW Patient Height RT Assess,
Height For IBW Vent Misc,
IBW Patient Height RT Assess

我愿意接受任何建议尝试使这项工作。理想情况下,我希望能够在子查询中查看结果,以确保它们存在于另一个表中。

此查询当前返回第一个实例

select vbs.Name, 
        SUBSTRING(sd.FormulaDetails, 
                  CHARINDEX('("', sd.FormulaDetails)+2,(CHARINDEX('")',sd.FormulaDetails) - CHARINDEX('("', sd.FormulaDetails))-2)
from StatementDefinitions sd, MvVBScript vbs
where sd.ScriptID = vbs.ID

1 个答案:

答案 0 :(得分:2)

您可以使用WITH语句递归执行此操作。这是一个镜头。将varchar(max)更改为FormulaDetails列的数据类型。如果你想要它,这个查询返回ScriptID并对它找到的块的位置进行编号(因此'IBW Vent Misc的高度'将出现2)

with Chunks(id,occurrence,position,token,remainder) as (
  select
    ScriptID,
    cast(0 as int),
    charindex(@token,FormulaDetails),
    cast('' as varchar(max)),
    substring(c,charindex(@token,FormulaDetails)+1,len(FormulaDetails))
  from StatementDefinitions
  where FormulaDetails like '%'+@token+'%'
  union all
  select
    id,
    occurrence+1,
    charindex(@token,remainder)+position,
    cast(substring(remainder,1,charindex(@token,remainder)-1) as varchar(max)),
    substring(remainder,charindex(@token,remainder)+1,len(remainder))
  from Chunks
  where remainder like '%'+@token+'%'
)
  select id, occurrence, token from Chunks
  where occurrence > 0
  order by id;