zoukankan      html  css  js  c++  java
  • SQL中返回计算表达式的函数

    今天在做一个查询的时候遇到这样一个问题,有一行数据为:

    money  number

     10-5        3

    我要计算money*number的值,在网上找了很久,终于找一个了一个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 @v2 = v FROM @sv DELETE @sv WHERE ID = (SELECT MAX(ID) FROM @sv)
    SELECT @v1 = 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 @v = v FROM @sv
    RETURN @v
    END

    示例:

    select dbo.GetExp('3*(10-5)')
    /*结果
    --------------------
    15.000000
    */

    select dbo.GetExp(number+'*('+money+')') from tb
  • 相关阅读:
    自建 IPA 分发平台
    一个优雅的占位图解决方案。适用于 UITableView 和 UICollectionView。
    Vuejs2.0购物车和地址选配学习笔记
    UIWebView 加 MJRefresh 同时解决底部黑影问题
    UIWebView 不自动全屏播放视频
    左右分页按钮的集合视图控件。用于快速编写出集合视图上分页多按钮点击事件!
    课程总结
    IO流实训
    事件处理
    变色
  • 原文地址:https://www.cnblogs.com/zzj/p/1663974.html
Copyright © 2011-2022 走看看