2017-10-13 127 views
0

有無論如何有一個基於值是一個整數或一個字符產生不同結果的case表達式。動態CASE表達式

ID  CODE 
    1   ABC 
    2   123 
    3   YHU 
    4   456 
    5   ikl 

我正在尋找的是分離的int和炭的表達式。

結果例如

ID  CODE Category 
    1   ABC  Char 
    2   123  Int 
    3   YHU  Char 
    4   456  Int 
    5   ikl  Char 

我一般的邏輯

CASE WHEN CODE = INT THEN 'Int' Else 'Char' end as Category 

但我不知道這是否是在SQL可能嗎?

我期待主要是一種方式,以識別是否其int或字符

UPDATE:

什麼是從字符的數字,*和分離的最佳方法 - 使用CASE表達式爲2點不同的類別

ID  CODE Category 
    1   *  No_NUM 
    2   123  NUM 
    3   YHU  No_NUM 
    4   456  NUM 
    5   ikl  No_NUM 
    6   -  No_NUM 

回答

2

您可以使用SQL ISNUMERIC功能。

SELECT ID, CODE, CASE ISNUMERIC(CODE) WHEN 1 THEN 'NUM' ELSE 'No_NUM' END AS Category FROM my_table; 

用正則表達式的另一個變化

SELECT ID, CODE, CASE WHEN CODE LIKE '%[0-9]%' THEN 'NUM' ELSE 'No_NUM' END AS Category FROM my_table; 
0

你可以使用TRY_CAST(SQL服務器2012+)

SELECT *, 
    CASE WHEN TRY_CAST(CODE AS INT) IS NOT NULL THEN 'Int' ELSE 'Char' END 
FROM tab; 

我認爲該列是NOT NULL

Rextester Demo

編輯:

它是文本里面CASE

SELECT *, 
    CASE WHEN TRY_CAST(CODE AS INT) IS NOT NULL THEN 'NUM' ELSE 'No_NUM' END 
FROM tab; 

Rextester Demo 2

+0

你可以看看我的更新 –

0

使用PATINDEX:

create table #temp ([ID] int, [CODE] nvarchar(5)) 

insert into #temp values (1, '*') 
insert into #temp values (2, '123') 
insert into #temp values (3, 'YHU') 
insert into #temp values (4, '456') 
insert into #temp values (5, 'ikl') 

Select ID 
    , CASE when PATINDEX('%[0-9]%', [code]) = 1 then 'num' 
     -- when PATINDEX('%[^0-9]%', [code]) = 1 then 'no_num' 
     -- when PATINDEX('%[A-Z]%', [code]) = 1 then 'char' 
     -- when PATINDEX('%[^A-Z]%', [code]) = 1 then 'no_char' /*etc..*/ 
     ELSE 'no_num' END AS 'Category' 
from #temp