【发布时间】:2020-12-29 07:47:01
【问题描述】:
我的数据集如下所示
SQL Server 2012。
DECLARE @ELECTRONICS TABLE
(
RESISTORID INT,
CAPACITORID VARCHAR(10),
VOLT DECIMAL(6,2),
WATT INT,
PASSIVENUMBER INT
)
INSERT @ELECTRONICS
SELECT 100, 'TH', 1.2, 5, 93 UNION ALL
SELECT 200, 'TH', 1.2, 5, 93 UNION ALL
SELECT 300, 'TH', 1.5, 5, 93 UNION ALL
SELECT 100, 'TH', -2.9, 5, 93 UNION ALL
SELECT 500, 'RT', 3.3, 5, 93 UNION ALL
SELECT 540, 'TH', 0, 5, 93 UNION ALL
SELECT 540, 'SN', 3.3, 5, 93 UNION ALL
SELECT 540, 'UL', 4.2, 5, 93 UNION ALL
SELECT 800, 'TH', -2.4, 5, 93 UNION ALL
SELECT 300, 'RN', 2.2, 4, 35 UNION ALL
SELECT 300, 'RN', 2.5, 6, 35 UNION ALL
SELECT 100, 'RN', 1.2, 9, 35 UNION ALL
SELECT 200, 'RN', 1.2, 9, 35 UNION ALL
SELECT 300, 'RN', 1.5, 9, 35 UNION ALL
SELECT 100, 'RN', -2.9, 9, 35 UNION ALL
SELECT 800, 'RN', -2.4, 9, 31
我正在尝试编写一个表值 UDF,它接受一个参数 @PASSIVENUMBER,并根据 CAPACITORID、VOLT 和 WATT 生成 POWERTHRESHOLD 和 RESISTORID 的值。
在下面的 SQL 代码中使用的函数。
SELECT *, CASE WHEN RESISTORID IN ('100','540') THEN 'A03' ELSE 'A01' END AS RESISTORID,
CASE WHEN CAPACITORID = 'TH' AND VOLT >0 THEN (VOLT * 1000)
WHEN CAPACITORID = 'TH' AND VOLT = 0 THEN (WATT * 1000)
WHEN CAPACITORID <> 'TH' AND VOLT >0 THEN VOLT
ELSE WATT END AS POWERTHRESHOLD
FROM @ELECTRONICS
WHERE PASSIVENUMBER = 93
SELECT * ,CASE WHEN RESISTORID IN ('300','800') THEN 'B03' ELSE 'B01' END AS RESISTORID,
CASE WHEN CAPACITORID = 'RN' AND VOLT >0 THEN (VOLT * 10*3/56)
WHEN CAPACITORID = 'RN' AND VOLT = 0 THEN (WATT * 100*2/21)
WHEN CAPACITORID <> 'RN' AND VOLT >10 THEN VOLT
ELSE WATT END AS POWERTHRESHOLD
FROM @ELECTRONICS
WHERE PASSIVENUMBER = 35
当 PASSIVENUMBER = 93 时输出
RESISTORID CAPACITORID VOLT WATT PASSIVENUMBER RESISTORID POWERTHRESHOLD
100 TH 1.20 5 93 A03 1200.00
200 TH 1.20 5 93 A01 1200.00
300 TH 1.50 5 93 A01 1500.00
100 TH -2.90 5 93 A03 5.00
500 RT 3.30 5 93 A01 3.30
540 TH 0.00 5 93 A03 5000.00
540 SN 3.30 5 93 A03 3.30
540 UL 4.20 5 93 A03 4.20
800 TH -2.40 5 93 A01 5.00
当 PASSIVENUMBER = 35 时输出
RESISTORID CAPACITORID VOLT WATT PASSIVENUMBER RESISTORID POWERTHRESHOLD
300 RN 2.20 4 35 B03 2200.00
300 RN 2.50 6 35 B03 2500.00
100 RN 1.20 9 35 B01 1200.00
200 RN 1.20 9 35 B01 1200.00
300 RN 1.50 9 35 B03 1500.00
100 RN -2.90 9 35 B01 9.00
如何实现一个用 case 语句检查值的函数。
我尝试过这样的代码没有给出正确的结果。
CREATE FUNCTION [dbo].[fnchkID]
(
@PASSIVENUMBER INT
)
RETURNS INT
AS
BEGIN
RETURN
CASE
WHEN CAPACITORID = RN and @VOLT>0 THEN VOLT * 1000
ELSE WATT from @ELECTRONICS
END
END
请分享你的想法。
【问题讨论】:
-
问题是什么?
-
您的问题到底是什么?你的代码有效吗?你被困在哪里了?我假设您咨询了official docs。仅供参考,它是
case表达式 而不是 statement。 -
@Fabio:如何实现用case语句检查值的功能。
-
将所有“外部”值作为参数传递给函数。
标签: sql sql-server tsql user-defined-functions