我可以替换SQL中存储在字符串中的公式中的子字符串吗?
我需要替换SQL中作为字符串存储的公式中的值 列中存储的公式示例: '=AA+BB/DC' '=-(AA+CC)' '=AA/BB+DD' 我将AA、BB等的值存储在另一个表中 我能否从公式中找到并用数值替换“AA”、“BB”等,以实际计算公式? 我假设我还需要将算术运算符(“+”、“/”)从字符串替换为实际符号,如果是这样,有没有办法 期望的结果 假设:AA=10,BB=20,DC=5 我需要 “=AA+BB/DC”转换为10+20/5,最终输出为14 请注意,公式在未来可能会改变,所以我需要一些有弹性的东西我可以替换SQL中存储在字符串中的公式中的子字符串吗?,sql,sql-server,Sql,Sql Server,我需要替换SQL中作为字符串存储的公式中的值 列中存储的公式示例: '=AA+BB/DC' '=-(AA+CC)' '=AA/BB+DD' 我将AA、BB等的值存储在另一个表中 我能否从公式中找到并用数值替换“AA”、“BB”等,以实际计算公式? 我假设我还需要将算术运算符(“+”、“/”)从字符串替换为实际符号,如果是这样,有没有办法 期望的结果 假设:AA=10,BB=20,DC=5 我需要 “=AA+BB/DC”转换为10+20/5,最终输出为14 请注意,公式在未来可能会改变,所以我需要
谢谢大家! 好吧,这是一个真正的黑客,但我对你的问题很感兴趣。您可以将我的示例转化为一个函数,然后根据您的具体需要对其进行重构 注意:使用
翻译
需要SQL Server 2017。这对你来说可能是个破坏者<代码>翻译大大简化了更换过程
这个例子就是一个例子。黑客。性能问题是未知的。你仍然需要通过测试来努力
-- Create a mock-up of the values table/data.
DECLARE @Values TABLE ( [key] VARCHAR(2), [val] INT );
INSERT INTO @Values ( [key], [val] ) VALUES
( 'AA', 10 ), ( 'BB', 20 ), ( 'CC', 6 ), ( 'DC', 5 );
-- Variable passed in to function.
DECLARE @formula VARCHAR(255) = '=(AA+BB)/DC';
-- Remove unnecessary mathmatical characters from the formula values.
DECLARE @vals VARCHAR(255) = REPLACE ( TRANSLATE ( @formula, '=()', '___' ), '_', '' );
-- Remove any leading mathmatical operations from @vals.
WHILE PATINDEX ( '[A-Z]', LEFT ( @vals, 1 ) ) = 0
SET @vals = SUBSTRING ( @vals, 2, LEN ( @vals ) );
-- Use SQL hack to replace placeholder values with actual values...
SELECT @formula = REPLACE ( @formula, fx.key_val, v.val )
FROM (
SELECT
[value] AS [key_val],
ROW_NUMBER() OVER ( ORDER BY ( SELECT NULL ) ) AS [key_id]
FROM STRING_SPLIT ( TRANSLATE ( @vals, '+/*-', ',,,,' ), ',' )
) AS fx
INNER JOIN @Values v
ON Fx.[key_val] = v.[key]
ORDER BY
fx.[key_id]
-- Return updated formula.
SELECT @formula AS RevisedFormula;
-- Return the result (remove the equals sign).
SET @formula = FORMATMESSAGE ( 'SELECT %s AS FormulaResult;', REPLACE ( @formula, '=', '' ) );
EXEC ( @formula );
选择@formula作为修订公式代码>返回:
+----------------+
| RevisedFormula |
+----------------+
| =(10+20)/5 |
+----------------+
+----------------+
| RevisedFormula |
+----------------+
| =-(10+6) |
+----------------+
+---------------+
| FormulaResult |
+---------------+
| -16 |
+---------------+
我的示例的最后一部分使用EXEC
进行计算不能在函数中使用EXEC。
-- Return the result (remove the equals sign).
SET @formula = FORMATMESSAGE ( 'SELECT %s AS FormulaResult;', REPLACE ( @formula, '=', '' ) );
EXEC ( @formula );
返回
+---------------+
| FormulaResult |
+---------------+
| 6 |
+---------------+
将公式值更改为=-(AA+CC)
将返回:
+----------------+
| RevisedFormula |
+----------------+
| =(10+20)/5 |
+----------------+
+----------------+
| RevisedFormula |
+----------------+
| =-(10+6) |
+----------------+
+---------------+
| FormulaResult |
+---------------+
| -16 |
+---------------+
可能值得注意的是,要注意公式中的数学顺序。=AA+BB/DC
的原始示例返回14,而不是预期的6。例如,我将您的公式更新为=(AA+BB)/DC
。不容易。为此,您需要使用动态SQL。或者您可能有自己的定制功能。每当我看到这样的需求时,它总是看起来像一个。SQL不是一种脚本语言,您不能执行类似于SELECT REPLACE(REPLACE(REPLACE('(AA+BB)/CC)'、'AA',10、'BB',12、'CC',2)的操作
并期望它返回11
;它将返回varchar
值'(10+12)/2'
<代码>(n)varchar
s不被解析为表达式;它们只是字符串。计算是绝对的、肯定的,不需要在数据库中以其他方式进行,还是只需将表达式和所需的值返回给调用应用程序,并使用普通编程语言进行分析和计算?有两个选项:1.为所需的每个公式创建一个函数2。使用动态SQL。这可能会更少performant@larnu实际上,使用动态SQL是可能的。有一种方法可以实现公式的“解析”akaeval()
,但这些公式应该进行调整,以使其正确的算术表达式(从而删除=
)。再加上所有变量的替换,所有这些都需要一个过程。