动态CASE表达式

时间:2017-10-13 13:56:34

标签: sql sql-server case

无论如何都有一个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 

3 个答案:

答案 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