SQL中返回计算表达式的函数

数据库 SQL Server
SQL中的函数可以实现很多的功能,下面为您介绍一个SQL中返回计算表达式的函数,供您参考和学习,希望对您有所启迪。

下面为您介绍一个SQL中返回计算表达式的函数,该函数可以计算加、减、乘、除,但是不能算幂,供您参考,希望对您学习SQL中的函数能有有所帮助。

 

CREATE FUNCTION dbo.GetExp(@pstrExpress AS VARCHAR(8000))  
RETURNS DECIMAL(18,6) AS  
BEGIN  
DECLARE @i INT,@j INT   
DECLARE @c1 CHAR(1),@c2 CHAR(1),@c VARCHAR(100)  
DECLARE @v1 DECIMAL(18,6),@v2 DECIMAL(18,6),@v DECIMAL(18,6)  
DECLARE @t TABLE(ID INT IDENTITY(1,1),s VARCHAR(100))  
DECLARE @s TABLE(ID INT IDENTITY(1,1),s VARCHAR(100))  
DECLARE @sv TABLE(ID INT IDENTITY(1,1),v DECIMAL(18,6))  
 
SET @pstrExpress = REPLACE(@pstrExpress,' ','')  
SELECT @i = 0,@j = LEN(@pstrExpress),@c2 = '',@c = '' 
WHILE @i<@j  
BEGIN  
 SELECT @c1 = @c2,@i = @i+1  
 SELECT @c2 = SUBSTRING(@pstrExpress,@i,1)  
 IF CHARINDEX(@c2,'.0123456789') > 0 or (@c2 = '-' and @c1 IN('','*','-','+','/','('))  
 BEGIN   SELECT @c = @c + @c2   CONTINUE  END  
 IF @c <> ''  BEGIN INSERT @t(s)  SELECT @c SELECT @c = '' END  
 IF CHARINDEX(@c2,')')>0  
 BEGIN   
   INSERT @t(s)  SELECT s FROM @s WHERE ID > ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(')),0) ORDER BY ID DESC  
   DELETE @s WHERE ID >= ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(')),0)   
   CONTINUE  
 END  
 IF CHARINDEX(@c2,'+-)')>0  
 BEGIN   
   INSERT @t(s)  SELECT s FROM @s WHERE ID > ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(')),0) ORDER BY ID DESC  
   DELETE @s WHERE ID > ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(')),0)   
   IF @c2 <> ')' INSERT @s(s) SELECT @c2  
   CONTINUE  
 END  
 IF CHARINDEX(@c2,'*/')>0  
 BEGIN   
   INSERT @t(s)  SELECT s FROM @s WHERE ID > ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(','+','-')),0) ORDER BY ID DESC  
   DELETE @s WHERE ID > ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(','+','-')),0)   
   INSERT  @s SELECT @c2  
   CONTINUE  
 END  
 IF CHARINDEX(@c2,'(')>0 INSERT  @s SELECT @c2  
END  
IF @c <> '' INSERT @t(s) SELECT @c  
INSERT @t(s)  SELECT s FROM @s ORDER BY ID DESC  
SELECT @i = 0,@j = MAX(ID) FROM @t   
WHILE @i < @j  
BEGIN   
 SELECT @i = @i + 1  
 SELECT @c = s FROM @t WHERE ID = @i  
 IF @c = '(' CONTINUE  
 IF @c NOT IN('*','-','+','/')  BEGIN  INSERT @sv(v) SELECT CONVERT(float,@c) CONTINUE END  
 SELECT @vv2 = v FROM @sv  DELETE @sv  WHERE ID = (SELECT MAX(ID) FROM @sv)  
 SELECT @vv1 = v FROM @sv  DELETE @sv  WHERE ID = (SELECT MAX(ID) FROM @sv)  
 SELECT @v = CASE @c WHEN '+' THEN @v1 + @v2 WHEN '-' THEN @v1 - @v2  
                     WHEN '*' THEN @v1 * @v2 WHEN '/' THEN @v1 / @v2 END  
 INSERT @sv(v) SELECT @v  
END  
SELECT @vv = v FROM @sv  
RETURN @v  
END 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.

 

 

【编辑推荐】

SQL中DATENAME函数的用法

SQL中循环语句的效果实例

SQL中类似For循环处理的实例

对存储过程代替SQL语句的讨论

SQL聚合函数之Avg 函数

 

责任编辑:段燃 来源: 互联网
相关推荐

2011-05-30 16:11:46

Javascript

2024-03-25 13:46:12

C#Lambda编程

2011-05-11 17:40:30

PHP正则表达式

2022-09-08 11:35:45

Python表达式函数

2022-09-09 00:25:48

Python工具安全

2020-10-16 06:40:25

C++匿名函数

2021-06-28 08:01:57

JS 函数表达式函数声明

2022-08-29 23:49:41

Python字符串代码

2009-08-31 17:11:37

Lambda表达式

2010-11-16 14:53:02

Oracle游标表达式

2024-10-17 17:03:43

SQL正则表达式MySQL

2014-01-05 17:41:09

PostgreSQL表达式

2010-11-12 13:20:31

SQL Server

2017-08-01 00:19:15

Javascript函数函数声明

2022-01-14 07:56:39

C#动态查询

2009-07-21 14:03:00

Scalaif表达式while循环

2020-11-04 09:23:57

Python

2009-07-09 09:51:07

Lambda表达式C#

2012-04-28 15:22:46

PHP

2021-08-31 07:19:41

Lambda表达式C#
点赞
收藏

51CTO技术栈公众号