下面为您介绍一个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.
【编辑推荐】