2017-10-13 87 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