>中的错误或者<在sql中的符号?

时间:2016-08-22 09:42:30

标签: sql sql-server

我的代码是:

DECLARE @String VARCHAR(100)
SET @String = 'Before 91-150 days'

-- Chop off the end character
SET @String = 
      CASE @String 
         WHEN null THEN null 
         ELSE (CASE LEN(@String) 
                  WHEN 0 THEN @String           
                  WHEN (charindex('-',(SUBSTRING(@String, charindex(' ', @String), CHARINDEX(' ', @String) - 3))) > 0) THEN --(shows error in >)
                        SUBSTRING(@String, charindex(' ', @String), CHARINDEX(' ', @String) - 4) - 1 
                  WHEN (charindex('-', SUBSTRING(@String, charindex(' ', @String), CHARINDEX(' ', @String) - 3)) < 0) THEN --(shows error in <)
                        SUBSTRING(@String, charindex(' ', @String), CHARINDEX(' ', @String) - 3) - 1
               END) 
      END

SELECT @String

错误是:

  

Msg 102,Level 15,State 1,Line 12
  '&gt;'附近的语法不正确。

我不知道我做错了什么......

提前致谢。

3 个答案:

答案 0 :(得分:3)

你的case没有意义。第一个是when 0,但第二个是布尔值。通过移动int中的第一个LEN,让他们都使用WHEN

CASE 
    WHEN LEN(@String) = 0 
        THEN @String          
    WHEN CHARINDEX('-', SUBSTRING(@String, charindex(' ',@String), CHARINDEX(' ',@String)-3), 0) > 0
        THEN --Other stuff

答案 1 :(得分:1)

您的代码缺少子串/替换

SUBSTRING(@String, charindex(' ', @String), CHARINDEX(' ', @String) - 4)

您不在此处使用'-'位置。第一个和第二个CHARINDEX将指向相同的' '(位置7) - 这就是为什么这段代码完全没有任何意义

SUBSTRING ( expression ,start , length )
http://msdn.microsoft.com/en-us/library/ms187748.aspx

您可以通过

代码修复它
  1. 首先从第一个空格到字符串结尾使用子字符串,
  2. 从第一阶段到第一个空格(给出原始字符串中的第二个空格)获取阶段1中获得的字符串的子字符串
  3. 搜索“ - ”分隔符并使用分离的字符串部分
  4. 因此您的代码至少需要两个子字符串。

    试试这个:

    DECLARE @String VARCHAR(100)
    SET @String = 'Before 91-150 days'
    
    
    SET @String = LTRIM(REPLACE(@String, 'before', ''))
    
    SELECT @String
    
    IF CHARINDEX('-', @String) > 0
    BEGIN
        SET @String = LEFT(@String, CHARINDEX('-', @String)-1)
        SELECT @String
    
        SELECT TRY_CAST(@String AS INT)-1
    END
    

    DECLARE @String VARCHAR(100)
    SET @String = 'Before 91-150 days'
    
    SELECT 
        CASE
            WHEN CHARINDEX('-', LTRIM(REPLACE(@String, 'before', ''))) > 0
            THEN TRY_CAST(LEFT(LTRIM(REPLACE(@String, 'before', '')), CHARINDEX('-',  LTRIM(REPLACE(@String, 'before', '')))-1) AS INT)-1
            ELSE @String
        END 
    

    两者都有印刷品:

    GO
    PRINT 'test-1'
    
    DECLARE @String VARCHAR(100)
    SET @String = 'Before 91-150 days'
    
    
    SET @String = LTRIM(REPLACE(@String, 'before', ''))
    
    PRINT @String
    
    IF CHARINDEX('-', @String) > 0
    BEGIN
        SET @String = LEFT(@String, CHARINDEX('-', @String)-1)
        PRINT @String
    
        PRINT TRY_CAST(@String AS INT)-1
    END
    PRINT '==='
    
    GO
    PRINT 'test-2'
    
    DECLARE @String VARCHAR(100)
    SET @String = 'Before 91-150 days'
    
    PRINT 
        CASE
            WHEN CHARINDEX('-', LTRIM(REPLACE(@String, 'before', ''))) > 0
            THEN TRY_CAST(LEFT(LTRIM(REPLACE(@String, 'before', '')), CHARINDEX('-',  LTRIM(REPLACE(@String, 'before', '')))-1) AS INT)-1
            ELSE @String
        END 
    
    PRINT '==='
    GO
    

    输出:

    test-1
    91-150 days
    91
    90
    ===
    test-2
    90
    ===
    

答案 2 :(得分:0)

尝试使用以下查询。

DECLARE @String VARCHAR(100)
SET @String = 'Before 91-150 days'

-- Chop off the end character
SET @String = 
      CASE  WHEN @String IS NULL 
            THEN null 
            WHEN LEN(@String)= 0 
            THEN @String          
            WHEN (charindex('-',(SUBSTRING(@String,charindex(' ',@String),CHARINDEX(' ',@String)-3))) > 0) 
            THEN SUBSTRING(@String,charindex(' ',@String),CHARINDEX(' ',@String)-4) -1 
            WHEN (charindex('-',SUBSTRING(@String,charindex(' ',@String),CHARINDEX(' ',@String)-3)) < 0) 
            THEN SUBSTRING(@String,charindex(' ',@String),CHARINDEX(' ',@String)-3) -1
       END 


SELECT @String