use*_*725 3 sql nested case sql-server-2008
我的逻辑必须有点时髦,因为当我测试以确保这些CASE陈述是真的时,我不会得到预期的结果......
例如,如果Sample1 = 'FI',Sample2 = 'GOVT'而且Sample3 = 'GOVT',我没有'OKFI'...我知道我必须在某处有一些古怪的逻辑......
有关这些事情的最佳实践的任何想法?
CREATE FUNCTION SampleFunction
(
@Sample1 varchar(50),
@Sample2 varchar(50) = null,
@Sample3 varchar(50) = null
)
RETURNS VARCHAR(255)
AS
BEGIN
declare @output varchar(255)
SET @output =
CASE WHEN @Sample1 = 'CASH' THEN 'CASH'
WHEN @Sample1 = 'ST' THEN
CASE WHEN @Sample2 ='TBILL' THEN
CASE WHEN @Sample3 = 'TBILL' THEN 'OKFI'
WHEN @Sample1 = 'FI' THEN
CASE WHEN @Sample2 = 'GOVT' THEN
CASE WHEN @Sample3 = 'GOVT' THEN 'OKFI'
WHEN @Sample1 = 'DERV' THEN
CASE WHEN @Sample2 = 'CURRCONT' THEN
CASE WHEN @Sample3 = 'FORWARD' THEN 'CASH'
WHEN @Sample3 = 'SPOT' THEN 'CASH'
WHEN @Sample2 = 'SWAP' THEN
CASE WHEN @Sample3 = 'CURRSWAP' THEN 'CASH'
WHEN @Sample3 = 'INDXSWAP' THEN 'OTHER'
WHEN @Sample2 = 'FUTURE' THEN
CASE WHEN @Sample3 = 'COMFUT' THEN 'COM'
WHEN @Sample3 = 'BFUT' THEN 'OKFI'
WHEN @Sample3 = 'NDXFUT' THEN 'OKSHARES'
WHEN @Sample3 = 'EQFUT' THEN 'OKSHARES'
WHEN @Sample3 = 'CURRFUT' THEN 'CASH'
WHEN @Sample2 = 'OPTION' THEN
CASE WHEN @Sample3 = 'CUROPTION' THEN 'CASH' END
ELSE 'OTHER'
END END END
END END END
END END END RETURN @Output
END -- FUNCTION
Run Code Online (Sandbox Code Playgroud)
您应该创建@table变量,甚至是物理永久表的列Sample1, Sample2, Sample3, Output-插入所有的组合和其所需的输出,然后只需选择Output从它的基础上你的@Sample1,@Sample2,@Sample3变量.
通过CASE内部的几十个CASE,您将会迷失方向.
像这样的东西:
CREATE FUNCTION SampleFunction2
(
@Sample1 VARCHAR(50) ,
@Sample2 VARCHAR(50) = NULL ,
@Sample3 VARCHAR(50) = NULL
)
RETURNS VARCHAR(255)
AS
BEGIN
DECLARE @output VARCHAR(255)
DECLARE @tempResults TABLE
(
Sample1 VARCHAR(50) ,
Sample2 VARCHAR(50) ,
Sample3 VARCHAR(50) ,
[Output] VARCHAR(255)
)
INSERT INTO @tempResults
VALUES ( 'CASH', NULL, NULL, 'CASH' )
,( 'ST', 'TBILL', 'TBILL', 'OKFI' )
,( 'FI', 'GOVT', 'GOVT', 'OKFI' )
,( 'DERV', 'CURRCONT', 'FORWARD', 'CASH' )
,( 'DERV', 'CURRCONT', 'SPOT', 'CASH' )
,( NULL, 'SWAP', 'CURRSWAP', 'CASH' )
,( NULL, 'SWAP', 'INDXSWAP', 'OTHER' )
,( NULL, 'FUTURE', 'COMFUT', 'COM' )
,( NULL, 'FUTURE', 'BFUT', 'OKFI' )
,( NULL, 'FUTURE', 'NDXFUT', 'OKSHARES' )
,( NULL, 'FUTURE', 'EQFUT', 'OKSHARES' )
,( NULL, 'FUTURE', 'CURRFUT', 'CASH' )
,( NULL, 'OPTION', 'CUROPTION', 'CASH' )
SELECT @output = [Output]
FROM @tempResults
WHERE (@Sample1 IS NULL OR Sample1 = @Sample1)
AND (@Sample2 IS NULL OR Sample2 = @Sample2)
AND (@Sample3 IS NULL OR Sample3 = @Sample3)
IF @output IS NULL SET @output = 'OTHER'
RETURN @output
END
Run Code Online (Sandbox Code Playgroud)
如果你想坚持使用CASE,原始查询的问题就是错放了ENDs:
CREATE FUNCTION SampleFunction
(
@Sample1 varchar(50),
@Sample2 varchar(50) = null,
@Sample3 varchar(50) = null
)
RETURNS VARCHAR(255)
AS
BEGIN
declare @output varchar(255)
SET @output =
CASE WHEN @Sample1 = 'CASH' THEN 'CASH'
WHEN @Sample1 = 'ST' THEN
CASE WHEN @Sample2 ='TBILL' THEN
CASE WHEN @Sample3 = 'TBILL' THEN 'OKFI'
END
END
WHEN @Sample1 = 'FI' THEN
CASE WHEN @Sample2 = 'GOVT' THEN
CASE WHEN @Sample3 = 'GOVT' THEN 'OKFI'
END
END
WHEN @Sample1 = 'DERV' THEN
CASE WHEN @Sample2 = 'CURRCONT' THEN
CASE WHEN @Sample3 = 'FORWARD' THEN 'CASH'
WHEN @Sample3 = 'SPOT' THEN 'CASH'
END
END
WHEN @Sample2 = 'SWAP' THEN
CASE WHEN @Sample3 = 'CURRSWAP' THEN 'CASH'
WHEN @Sample3 = 'INDXSWAP' THEN 'OTHER'
END
WHEN @Sample2 = 'FUTURE' THEN
CASE WHEN @Sample3 = 'COMFUT' THEN 'COM'
WHEN @Sample3 = 'BFUT' THEN 'OKFI'
WHEN @Sample3 = 'NDXFUT' THEN 'OKSHARES'
WHEN @Sample3 = 'EQFUT' THEN 'OKSHARES'
WHEN @Sample3 = 'CURRFUT' THEN 'CASH'
END
WHEN @Sample2 = 'OPTION' THEN
CASE WHEN @Sample3 = 'CUROPTION' THEN 'CASH'
END
ELSE 'OTHER'
END RETURN @Output
END -- FUNCTION
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
74602 次 |
| 最近记录: |