2016-09-28 59 views
0

我在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 
+0

建议什么?好/坏主意?如何实施? –

+0

1 = A,2 = D的规则是什么?我认为2应该= B –

+1

看看'CASE'而不是'IF'。 - 例如'例如,如果输入LIKE'A%',那么1如果类型'D%'那么2当...' –

回答

2

使用CASE而不是IF

SELECT 
    Type, 
    CASE 
     WHEN Type LIKE 'A%' then 1 
     WHEN Type Like 'D%' THEN 2 
     WHEN ... 
    END AS Type1 
... 
+0

谢谢。这工作。 – lbrrrr

+0

还有一个问题:我想将这个新的列类型1放入Where子句中,并且它是错误的。能否请你帮忙? – lbrrrr

+0

您不能在WHERE子句中引用计算列,因为首先会评估WHERE。您可以使用子查询或更改'WHERE'来使用表格字段。 –

0
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 
0

正如其他人所指出的那样,一个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 
0

如果你想数订单,请在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 
0

如果你想把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' 
0

我知道这个问题已经回答了,但我想我会加我2美分。

如果可能值的数量会变得非常大,导致case语句变得非常大,您可能需要考虑为自己创建一个loopkup表。

您将能够在两个表格之间进行连接以获取相关的列值。