Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以替换SQL中存储在字符串中的公式中的子字符串吗?_Sql_Sql Server - Fatal编程技术网

我可以替换SQL中存储在字符串中的公式中的子字符串吗?

我可以替换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中作为字符串存储的公式中的值

列中存储的公式示例:

'=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是可能的。有一种方法可以实现公式的“解析”aka
eval()
,但这些公式应该进行调整,以使其正确的算术表达式(从而删除
=
)。再加上所有变量的替换,所有这些都需要一个过程。