我要提取的欄位取決于另一個欄位的值。我有一個如下所示的查找表:
| 字首 | 一個值 | B值 | C_值 | D_值 |
|---|---|---|---|---|
| 一個 | 1 | 2 | 3 | 4 |
| 乙 | 5 | 6 | 7 | 8 |
| C | 9 | 10 | 11 | 12 |
我正在尋找一種基于 Prefix 列提取適當值的方法。會是這樣的:
Select selected_column = Prefix '_value'
期望的結果是:
| 選定的列 |
|---|
| 1 |
| 6 |
| 11 |
我可以使用一堆 CASE/WHEN 運算式輕松實作這一點,但我想看看是否有一種方法可以輕松地動態呼叫所需的列。
uj5u.com熱心網友回復:
好吧,如果它真的是A_value-> Z_value,你可以使用CHOOSE:
SELECT selected_column = CHOOSE
(
ASCII(Prefix)-64,
A_value,
B_value,
C_value,
D_value
)
FROM dbo.[a lookup table];
- 示例資料庫
uj5u.com熱心網友回復:
你可以走 JSON 路線。
select cast(json_value(json_values, '$[0].' Prefix '_value') as int) as selected_column from your_lookup_table t cross apply ( select t.* for json path ) ca(json_values)
| 選定的列 |
|---|
| 1 |
| 6 |
| 11 |
但如果它只有幾列,那么也許使用 aCASE是最直接的方法。
select
case Prefix
when 'A' then A_value
when 'B' then B_value
when 'C' then C_value
when 'D' then D_value
end as selected_column
from your_lookup_table
關于db<>fiddle 的演示在這里
uj5u.com熱心網友回復:
您可以使用 CURSOR :
declare @t table (Prefix nvarchar(50),A_value int,B_value int,C_value int,D_value int)
insert into @t values ('A', 1, 2, 3, 4)
insert into @t values ('B', 5, 6, 7, 8)
insert into @t values ('C', 9, 10, 11, 12)
declare @result table (selected_column int)
declare @Prefix nvarchar(50),@A_value int,@B_value int,@C_value int,@D_value int
DECLARE db_cursor CURSOR FOR
SELECT Prefix,A_value,B_value, C_value,D_value
FROM @t
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @Prefix,@A_value,@B_value, @C_value,@D_value
WHILE @@FETCH_STATUS = 0
BEGIN
insert into @result
Select CASE
WHEN @Prefix='A' THEN @A_value
WHEN @Prefix='B' THEN @B_value
WHEN @Prefix='C' THEN @C_value
WHEN @Prefix='D' THEN @D_value
END;
FETCH NEXT FROM db_cursor INTO @Prefix,@A_value,@B_value, @C_value,@D_value
END
CLOSE db_cursor
DEALLOCATE db_cursor
select * from @result
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/404977.html
標籤:
上一篇:使用存盤程序在SQLServer資料庫中同步來自Datafactory的元資料輸出錯誤:Json-在位置0找到意外的字符“S”
