为什么我的代码不起作用? (使用多表达式+强制转换+大小写)

Why my code doesn't work? (using multi expressions + cast + case)

我的专栏示例:

          (name) as varchar(50)
              s01
              s02
              s16

我想 Select 第一个缺少的 panelname 大于 0 也使用大小写和转换(在我的示例中所需的 select 将是 's03')

WITH cte AS(
    SELECT name 
    FROM customers 
    UNION ALL 
    SELECT 0
) 

SELECT  CASE WHEN cast(min(right(name, 2) + 1) as varchar(50)) < 10 THEN 's0' ELSE 's' END + 
        cast(min(right(name, 2) + 1) as varchar(50)) 
FROM cte 
WHERE NOT EXISTS ( 
    SELECT name 
    FROM customers  
    WHERE cast(right(customers.name, 2) as varchar(50)) = cast(right(cte.name, 2) as varchar(50))+1) 

此代码有效,但仅在我的 table 为空或 table 仅包含数字的情况下有效。

例如我在名称中的列-> 结果将是 s03

             1     or   101    
             2          102
             16         116

但是当它包含字母时

 example my columns in name
             s01         
             s02
             s016

没用。我得到一个错误:将 varchar 值 's01' 转换为数据类型 int 时转换失败。我应该把其他地方转换为 varchar 吗?

您正在将字符串 (varchar) 与 int 值进行比较,因此在将它们与 int 值进行比较或对其进行某些操作之前,请尝试将 varchar 数字转换为 int 而不是 varchar

也许是这样的(不确定这是否可行,但只是将其作为示例写成解决方案的样子):

WITH cte AS(SELECT panelname FROM inventorypanelcaptions UNION ALL SELECT 0) 
SELECT CASE WHEN min(cast(right(panelname, 2) as int)) + 1 < 10 THEN 'o0' ELSE 'o' + cast(min(cast(right(panelname, 2) as int)) + 1 as varchar(50)) END
FROM cte 
WHERE NOT EXISTS (SELECT panelname FROM inventorypanelcaptions WHERE cast(right(inventorypanelcaptions.panelname, 2) as int) = cast(right(cte.panelname, 2) as int) + 1)

(代表OP发表).

只需要转换联合 select。

    WITH cte AS(
    SELECT name 
    FROM customers 
    UNION ALL 
    SELECT CAST(0 AS VARCHAR(50)) 
    FROM INVENTORYPANELCAPTIONS
) 

SELECT  CASE WHEN  cast(min(right(name, 2) + 1) as varchar(50)) < 10 THEN 's0' ELSE 's' END 
        + cast(min(right(name, 2) + 1) as varchar(50)) 
FROM cte 
WHERE NOT EXISTS ( 
    SELECT name 
    FROM customers 
    WHERE right(customers.name, 2)= right(cte.name, 2)+1)