为什么我的代码不起作用? (使用多表达式+强制转换+大小写)
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)
我的专栏示例:
(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)