我的代码是:
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;'附近的语法不正确。
我不知道我做错了什么......
提前致谢。
答案 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
您可以通过
代码修复它因此您的代码至少需要两个子字符串。
试试这个:
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