2016-08-22 51 views
2

我的代碼是:在SQL中的錯誤或<符號?

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 

錯誤是:

消息102,級別15,狀態1,行12
附近有語法錯誤 '>'。

我不知道我做錯了......

在此先感謝。

+1

的MySQL或MS SQL Server? – jarlh

+1

SQL Server管理工作室2014. – Mogli

+0

在你的例子中該案件的輸出應該是什麼? –

回答

3

您的case s沒有意義。第一個是when 0,但第二個是布爾值。讓他們都使用一個int通過移動WHEN中的第一個LEN

CASE 
    WHEN LEN(@String) = 0 
     THEN @String   
    WHEN CHARINDEX('-', SUBSTRING(@String, charindex(' ',@String), CHARINDEX(' ',@String)-3), 0) > 0 
     THEN --Other stuff 
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 
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. 搜索「 - 」分隔符,並使用devided串部分

所以您的代碼需要至少兩個子。

試試這個:

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 
=== 
+0

感謝您的解釋。但是如果我寫這個查詢:select SUBSTRING('51-120天前',charindex('','51-120天前'),CHARINDEX('','51-120天前')它返回51- 120,所以這意味着兩個charindex都沒有返回相同的值。讓我知道如果我錯了。 – Mogli

+0

我猜第一個charindex正在返回起始值,第二個charindex正在返回值直到你想要字符串(最終值)。 – Mogli

+0

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