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

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

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

 

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

 

 

【编辑推荐】

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-09 00:25:48

Python工具安全

2022-09-08 11:35:45

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游标表达式

2014-01-05 17:41:09

PostgreSQL表达式

2010-11-12 13:20:31

SQL Server

2020-11-04 09:23:57

Python

2009-07-21 14:03:00

Scalaif表达式while循环

2022-01-14 07:56:39

C#动态查询

2017-08-01 00:19:15

Javascript函数函数声明

2009-03-16 14:01:24

正则表达式函数SQL

2009-07-09 09:51:07

Lambda表达式C#

2012-04-28 15:22:46

PHP

2021-08-31 07:19:41

Lambda表达式C#
点赞
收藏

51CTO技术栈公众号