SQL Server 2008
SELECT ('ABC-' +
MAX(CAST(
(SUBSTRING([ID], CASE CHARINDEX('-', [ID])
WHEN 0
THEN LEN([ID]) + 1
ELSE CHARINDEX('-', [ID]) + 1
END, 1000)+1)
AS VARCHAR)
)) AS next_id
FROM [STUFF]
WHERE [FK_DATA] = '12345'
表[STUFF]
包含列[ID]
,其值为“ABC-1”,“ABC-2”。但是WHERE子句可能会导致返回0行。
查询获得ABS的下一个增量,例如“ABC-3”。除非没有匹配的行。然后我没有得到任何结果。
它是子查询的一部分,所以我需要它返回'ABC-1'而不是什么。即内部部分必须返回1.(我的外部查询然后插入这个最新的增量。)
答案 0 :(得分:2)
你走了:
SELECT ('ABC-' +
ISNULL(
MAX(CAST(
(SUBSTRING([ID], CASE CHARINDEX('-', [ID])
WHEN 0
THEN LEN([ID]) + 1
ELSE CHARINDEX('-', [ID]) + 1
END, 1000)+1)
AS VARCHAR)
)) AS next_id
, 1)
FROM [STUFF]
WHERE [FK_DATA] = '12345'
子查询放在ISNULL函数中。通过执行此操作,您说如果子查询返回NULL值,请将其替换为值。
如果返回行,结果将如您所示,但如果没有返回任何行,则结果将为1.
答案 1 :(得分:1)
你可以这样做,取决于上下文,虽然它不太优雅
SELECT
答案 2 :(得分:0)
在子查询中或任何地方使用此@temptable
declare @temptable as table (next_id int)
insert into @temptable
SELECT ('ABC-' +
MAX(CAST(
(SUBSTRING([ID], CASE CHARINDEX('-', [ID])
WHEN 0
THEN LEN([ID]) + 1
ELSE CHARINDEX('-', [ID]) + 1
END, 1000)+1)
AS VARCHAR)
)) AS next_id
FROM [STUFF]
WHERE [FK_DATA] = '12345'
if not exists (select next_id from @temptable)
select 'ABC-1' as next_id
else
select * from @temptable
答案 3 :(得分:0)
SELECT 'ABC-' + CAST(
ISNULL((
SELECT MAX(SUBSTRING([ID], CASE CHARINDEX('-', [ID])
WHEN 0
THEN LEN([ID]) + 1
ELSE CHARINDEX('-', [ID]) + 1
END, 1000)
)
FROM [STUFF]
WHERE [FK_DATA] = '123456'
), 0) + 1 as VARCHAR(10)) AS next_id