我在Microsoft SQL Server中有以下一列,名爲Type
,我想創建另一列名爲Type 1
,如果帳戶以字母A開頭,則爲1,如果帳戶以D開頭,則爲2 ....如果ELSE在SQL Server中
我是新來的,所以有人請指教?
Type Type 1
AD 1
AV 1
AC 1
DE 2
DR 2
DG 2
KL 3
KL 3
我在Microsoft SQL Server中有以下一列,名爲Type
,我想創建另一列名爲Type 1
,如果帳戶以字母A開頭,則爲1,如果帳戶以D開頭,則爲2 ....如果ELSE在SQL Server中
我是新來的,所以有人請指教?
Type Type 1
AD 1
AV 1
AC 1
DE 2
DR 2
DG 2
KL 3
KL 3
SELECT Type,
CASE WHEN SUBSTRING(Type, 1, 1)='A' THEN 1
WHEN SUBSTRING(Type, 1, 1)='D' THEN 2
WHEN SUBSTRING(Type, 1, 1)='K' THEN 3
ELSE 0 END as 'Type 1'
FROM TableName
正如其他人所指出的那樣,一個CASE語句將滿足這種需求很容易。
如果你將要經常做這個翻譯,考慮增加一個計算列的表像這樣:使用升序的「類型」列的第一個字母
if object_id('ComputedColumnTest') is not null
drop table ComputedColumnTest;
go
create table ComputedColumnTest
(
TYPE varchar(2)
);
alter table ComputedColumnTest --<<<<<<<
add TYPE1 AS --<<<<<<<
( --<<<<<<<
case when [TYPE] like 'A%' then 1--<<<<<<<
when [TYPE] like 'D%' then 2--<<<<<<<
else 0 --<<<<<<<
end --<<<<<<<
) --<<<<<<<
insert into ComputedColumnTest([type]) values ('AD')
insert into ComputedColumnTest([type]) values ('AV')
insert into ComputedColumnTest([type]) values ('AC')
insert into ComputedColumnTest([type]) values ('DE')
insert into ComputedColumnTest([type]) values ('DR')
insert into ComputedColumnTest([type]) values ('DG')
insert into ComputedColumnTest([type]) values ('KL')
insert into ComputedColumnTest([type]) values ('KL')
select *
from ComputedColumnTest
where type1 = 2
如果你想數訂單,請在SQL Server中使用DENSE_RANK()。
;WITH cte_1
AS
(SELECT Type
,DENSE_RANK() OVER (ORDER BY LEFT(Type,1)) [Type 1]
FROM YourTable)
SELECT *
FROM cte_1
WHERE [Type 1]=1 --here you can add your filter criteria
如果你想把WHERE
放在計算列上,你必須把它包裝在子查詢中。
SELECT *
FROM (
SELECT Type
, (CASE LEFT(Type, 1)
WHEN 'A' THEN 1
WHEN 'D' THEN 2
END) AS Type1
) a
WHERE Type1 = 'some condition'
我知道這個問題已經回答了,但我想我會加我2美分。
如果可能值的數量會變得非常大,導致case語句變得非常大,您可能需要考慮爲自己創建一個loopkup表。
您將能夠在兩個表格之間進行連接以獲取相關的列值。
建議什麼?好/壞主意?如何實施? –
1 = A,2 = D的規則是什麼?我認爲2應該= B –
看看'CASE'而不是'IF'。 - 例如'例如,如果輸入LIKE'A%',那麼1如果類型'D%'那麼2當...' –