2016-09-28 63 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表。

您將能夠在兩個表格之間進行連接以獲取相關的列值。