Concat 在 case 语句中不起作用

Posted

技术标签:

【中文标题】Concat 在 case 语句中不起作用【英文标题】:Concat in not working inside case statement 【发布时间】:2021-11-02 16:50:00 【问题描述】:

我有一个月份列,其值从 1、2、3 到 12。我在下面写查询以将 1 位的列值转换为 2 位,即 1 和 2 之类的值将转换为 01 和 02,但是这种连接不起作用,月份仍然是个位数。

主要查询:

select 
    case 
        when len(month) = 1 
            then concat(0, month) 
            else month 
    end as month_new,
    month
from
    Table

但是当我按照下面的方式单独尝试查询时,连接有效,它将个位数月份转换为 2 位数

查询 1

select top 10 concat(0, month), month
from table

仅查询 1 有效

查询 2

select 
    case 
        when len(month) = 1 
            then 1 
            else 0 
    end, 
    month
from
    Table

单独的查询 2 正在工作,这意味着检查月份列中的长度按预期工作。但是当 concat 在 case 内使用时,它就不起作用了。

我已经修改了如下查询并为我工作

select 
    case 
        when len(month) = 1 
            then concat(0, month) 
            else cast(month as varchar)
    end as month_new,
    month
from
    table

【问题讨论】:

仅供参考 case 是一个表达式而不是一个语句 请提供示例数据、预期结果并解释“不工作”的含义。 你似乎混淆了你的字符串和整数。问题是您的 case 表达式。请参考 documentation Return Types 部分的 CASE 表达式。还有Data type precedence 【参考方案1】:

不知道您使用的是什么数据库,并且由于您没有提供任何示例数据,我只能假设您的 CASE 不是问题,但如果您想这样做,这意味着您的数据类型是字符串和您尝试在查询中使用整数 CONCAT 字符串。

也许您可以尝试将“引号”添加到您的零字符串和CAST 作为字符串的结果。

【讨论】:

【参考方案2】:

问题是month 是一个整数,而concat() 的结果是一个字符串。所以。 case 正在尝试将字符串转换回整数。您可以使用cast 将整数强制转换为字符串,但有更好的方法来做到这一点。

相反,只需使用FORMAT 函数:

select
     format(month, '00') as month_new
   , month
from viivscaazure.F_SALES_DETAIL

【讨论】:

以上是关于Concat 在 case 语句中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

窗口函数在 pd.read_sql 中不起作用;它显示错误

为啥这个准备语句在 MYSQLI 中不起作用?

访问更新语句在 C# 中不起作用

fillOval() 在 if 语句中不起作用[关闭]

为啥准备好的语句在java中不起作用?

基本的 If else 语句在 javascript 中不起作用