Table 作为参数传递的值函数以在 case 语句中生成输出
Table value function to pass as parameter to generate output inside case statement
我的数据集如下所示
SQL 服务器 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
我正在尝试编写一个 Table Valued UDF,它接受一个参数 @PASSIVENUMBER
,并根据 [=19] 为 POWERTHRESHOLD
和 RESISTORID
生成值=]、VOLT
和 WATT
.
下面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
请分享您的想法。
从这里开始...并相应地更改代码
CREATE FUNCTION [dbo].[fnchkID] (@PASSIVENUMBER INT)
RETURNS @fnchkID TABLE
(
RESISTORID INT,
CAPACITORID VARCHAR(10),
VOLT DECIMAL(6,2),
WATT INT,
PASSIVENUMBER INT
)AS
BEGIN
INSERT @fnchkID
select * from YourTable WHERE PASSIVENUMBER=@PASSIVENUMBER /* Your Logic goes here*/
RETURN
END
致电 TVF
select * from [dbo].[fnchkID] (93)
创建一个函数很好所以应该作为你的起点,因为他们有很多例子可以帮助你入门。
我建议使用 内联 Table-Valued 函数,因为它们通常比 Multi-Statement Table-Valued 的性能要好得多函数.
CREATE FUNCTION [dbo].[fnchkID]
(
@PASSIVENUMBER INT
)
RETURNS TABLE
RETURN
SELECT RESISTORID, CAPACITORID, VOLT, WATT, PASSIVENUMBER
, CASE WHEN RESISTORID IN ('100','540') THEN 'A03' ELSE 'A01' END AS NEWRESISTORID
, CASE WHEN PASSIVENUMBER = 93 THEN
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
WHEN PASSIVENUMBER = 35 THEN
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
END AS POWERTHRESHOLD
FROM @ELECTRONICS
WHERE PASSIVENUMBER = @PASSIVENUMBER;
注意:您的计算列不能与现有列同名,因此 NEWRESISTORID
而不是 RESISTORID
。
我的数据集如下所示
SQL 服务器 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
我正在尝试编写一个 Table Valued UDF,它接受一个参数 @PASSIVENUMBER
,并根据 [=19] 为 POWERTHRESHOLD
和 RESISTORID
生成值=]、VOLT
和 WATT
.
下面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
请分享您的想法。
从这里开始...并相应地更改代码
CREATE FUNCTION [dbo].[fnchkID] (@PASSIVENUMBER INT)
RETURNS @fnchkID TABLE
(
RESISTORID INT,
CAPACITORID VARCHAR(10),
VOLT DECIMAL(6,2),
WATT INT,
PASSIVENUMBER INT
)AS
BEGIN
INSERT @fnchkID
select * from YourTable WHERE PASSIVENUMBER=@PASSIVENUMBER /* Your Logic goes here*/
RETURN
END
致电 TVF
select * from [dbo].[fnchkID] (93)
创建一个函数很好
我建议使用 内联 Table-Valued 函数,因为它们通常比 Multi-Statement Table-Valued 的性能要好得多函数.
CREATE FUNCTION [dbo].[fnchkID]
(
@PASSIVENUMBER INT
)
RETURNS TABLE
RETURN
SELECT RESISTORID, CAPACITORID, VOLT, WATT, PASSIVENUMBER
, CASE WHEN RESISTORID IN ('100','540') THEN 'A03' ELSE 'A01' END AS NEWRESISTORID
, CASE WHEN PASSIVENUMBER = 93 THEN
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
WHEN PASSIVENUMBER = 35 THEN
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
END AS POWERTHRESHOLD
FROM @ELECTRONICS
WHERE PASSIVENUMBER = @PASSIVENUMBER;
注意:您的计算列不能与现有列同名,因此 NEWRESISTORID
而不是 RESISTORID
。