【发布时间】:2016-07-22 14:29:06
【问题描述】:
我的专栏例子:
(name) as varchar(50)
s01
s02
s16
我想使用 case 和 cast 来选择 0 以上的第一个缺失的面板名称(在我的示例中,所需的选择将是 '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)
此代码有效,但仅适用于我的表为空或表仅包含数字的情况。
以 name 中的列为例-> 结果将是 s03
1 or 101
2 102
16 116
但是当它包含字母时
example my columns in name
s01
s02
s016
它不起作用。我收到一个错误:将 varchar 值“s01”转换为数据类型 int 时转换失败。我应该把其他地方转换为 varchar 吗?
【问题讨论】:
-
有什么建议吗?或者它更好地使用其他代码来做我想做的事?
-
请编辑您的问题以将相关表格 DDL 和示例数据包含为 DML。
-
我编辑我的问题更具体。有什么建议吗?
-
我看到这个问题被标记为 Sql Server 2000。Sql Server 2000 已方式结束生命。它不再获得任何补丁,即使是针对关键的安全问题,并且现在已经有一段时间没有了。继续使用它是非常不负责任的。升级此服务器是工作 1。这也是您的代码无法正常工作的原因。直到 Sql Server 2005 才将 CTE 添加到 Sql Server。
-
这并没有更好。 Sql Server 2005 现在也终止了(截至今年 4 月 12 日)。
标签: sql sql-server-2005