无论如何都有一个case表达式,它根据一个整数或一个字符的值产生不同的结果。
表
ID CODE
1 ABC
2 123
3 YHU
4 456
5 ikl
我正在寻找一个将int和char分开的表达式。
结果,例如
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或char
更新:
使用案例表达式
将数字与char,*和 - 分成2个不同类别的最佳方法是什么? ID CODE Category
1 * No_NUM
2 123 NUM
3 YHU No_NUM
4 456 NUM
5 ikl No_NUM
6 - No_NUM
答案 0 :(得分:2)
您可以使用SQL ISNUMERIC函数。
SELECT ID, CODE, CASE ISNUMERIC(CODE) WHEN 1 THEN 'NUM' ELSE 'No_NUM' END AS Category FROM my_table;
REGEX的另一个变体
SELECT ID, CODE, CASE WHEN CODE LIKE '%[0-9]%' THEN 'NUM' ELSE 'No_NUM' END AS Category FROM my_table;
答案 1 :(得分:0)
您可以使用TRY_CAST
(SQL Server 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 强>
答案 2 :(得分: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