【问题标题】:Dynamic CASE expression [duplicate]动态 CASE 表达式 [重复]
【发布时间】:2017-10-13 13:56:33
【问题描述】:

是否有一个 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

更新:

使用 case 表达式将数字从 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 

【问题讨论】:

    标签: sql sql-server case


    【解决方案1】:

    你可以使用SQLISNUMERIC函数。

    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;
    

    【讨论】:

      【解决方案2】:

      您可以使用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

      【讨论】:

      • 你能看看我的更新吗
      【解决方案3】:

      使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-18
        • 1970-01-01
        • 1970-01-01
        • 2014-12-04
        • 2020-07-03
        • 2021-06-19
        • 2021-01-04
        • 1970-01-01
        相关资源
        最近更新 更多