有没有办法在数据库中找到的表达式中找到单词/字母的顺序?
这里要更清楚的是一个例子:
从表X中我得到姓名:" a"和" b"。 在其他表中有表达式:" b + a", 我需要的结果是b,1 |一个,2
有没有办法使用仅 SQL查询?
P.S。我没有找到任何关于这个主题的参考......
答案 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