我在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当...' –