如果没有找到行,如何让此SQL返回1

时间:2017-05-14 22:59:48

标签: sql-server sql-server-2008

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.(我的外部查询然后插入这个最新的增量。)

4 个答案:

答案 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