如何从字符串中获取表达式

时间:2012-04-20 12:43:09

标签: sql sql-server sql-server-2005

这是字符串:'(a + b)+(x / y)* 1000' 从那个字符串我想得到'(x / y)'意味着我希望包含该除法的部分稍后检查如果分母<> 0以避免被零除。

字符串公式可以有所不同,但除法总是在括号之间。

我如何在sql中实现这一目标?

2 个答案:

答案 0 :(得分:1)

使用(删除第二个stuff的所有内容,然后使用)将字符移至下一个left

declare @S varchar(20)
set @S = '(1+2)+(3/4)*1000'

select left(S2.S, charindex(')', S2.S)-1)
from (select stuff(@S, 1, charindex('(', @S), '')) as S1(S)
  cross apply (select stuff(S1.S, 1, charindex('(', S1.S), '')) as S2(S)

答案 1 :(得分:1)

看来您已经拥有(基于您所做的评论) ......

  • '/' = CHARINDEX('/', yourString)
  • 的位置
  • ')' = CHARINDEX(')', yourString, CHARINDEX('/', yourString) + 1)
  • 的位置

(的位置略有不同,因为您需要向后搜索。所以你需要反转字符串。所以你还需要改变起始位置。

  • CHARINDEX('(', REVERSE(yourString), LEN(yourString) - CHARINDEX('/', yourString) + 2)

从右侧给出位置。 LEN(yourString) - position + 1从左侧给出位置。

将所有这些加在一起,你得到一个很长的公式...

SUBSTRING(
  yourString,
    LEN(yourString)
  - CHARINDEX('(', REVERSE(yourString), LEN(yourString) - CHARINDEX('/', yourString) + 2)
  + 1,
    CHARINDEX(')', yourString, CHARINDEX('/', yourString) + 1)
  - LEN(yourString)
  + CHARINDEX('(', REVERSE(yourString), LEN(yourString) - CHARINDEX('/', yourString) + 2)
  - 1
)