仅使用sql \解析表达式的值的表达式解析表达式

时间:2016-07-27 08:08:41

标签: sql sql-server sql-server-2008

有没有办法在数据库中找到的表达式中找到单词/字母的顺序?

这里要更清楚的是一个例子:

从表X中我得到姓名:" a"和" b"。 在其他表中有表达式:" b + a", 我需要的结果是b,1 |一个,2

有没有办法使用 SQL查询?

P.S。我没有找到任何关于这个主题的参考......

2 个答案:

答案 0 :(得分:1)

(来自类似的question

您可以使用CHARINDEX()搜索较大字符串中的子字符串,并返回匹配的位置,如果找不到匹配则返回0。

CHARINDEX(' a ',' ' + REPLACE(REPLACE(@mainString,'+',' '),'.',' ') + ' ')

为可能发生的任何其他标点符号添加更多递归REPLACE()调用

对于您的问题,这里有一个例子:

INSERT INTO t1 ([name], [index])
SELECT name, CHARINDEX(' ' + name + ' ',' ' + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE('b * (c + a) / (b - c)','+',' '),'-',' '),'*',' '),'(',' '),')',' '),'/',' ') + ' ')
FROM t2

结果将是:

a, 10
b, 1
c, 6

答案 1 :(得分:1)

美丽的问题!看看这个解决方案,将表达式分解为标识符列表:

DECLARE @val varchar(MAX) = 'b * (c + a) / (b - c)';

WITH Split AS
(
    SELECT 1 RowNumber, LEFT(@val, PATINDEX('%[^a-z]%', @val)-1) Val, STUFF(@val, 1, PATINDEX('%[^a-z]%', @val), '')+'$' Rest
    UNION ALL
    SELECT RowNumber+1 Rownumber, LEFT(Rest, PATINDEX('%[^a-z]%', Rest)-1) Val, STUFF(Rest, 1, PATINDEX('%[^a-z]%', Rest), '') Rest
    FROM Split
    WHERE PATINDEX('%[^a-z]%', Rest)<>0
)
SELECT Val, ROW_NUMBER() OVER (ORDER BY MIN(RowNumber)) RowNumber FROM Split
WHERE LEN(Val)<>0
GROUP BY Val

它产生以下结果(仅首次出现):

b   1
c   2
a   3

如果使用DECLARE @val varchar(MAX) = 'as * (c + a) / (bike - car)'执行返回:

as      1
c       2
a       3
bike    4
car     5