在我的数据库中,我有一个条目:'V2.0.0.0 VersionData' 我需要我的case语句来查看这个值,从空格开始删除并在开始时删除V,离开'2.0.0.0,如果case语句大于2.0.1.0则返回'Pass',否则'Fail'
这是我到目前为止所做的,但它不起作用:
Select
CASE
When (Select
Convert(Decimal(4,4),
REPLACE(
LEFT(EntryValue,
CHARINDEX(' ', EntryValue) - 1),'v',''))
from table where entrytype = 'VERSION') BETWEEN 0 and 2.1 THEN 'Pass'
Else 'Fail'
END [V-Check]
答案 0 :(得分:0)
你的问题是那个
declare @EntryValue varchar(250)='V2.0.0.0 VersionData'
Select REPLACE(LEFT(@EntryValue,CHARINDEX(' ', @EntryValue) - 1),'v','')
--2.0.0.0
您没有可以像小数一样解释的字符串。 在不知道版本编号如何工作的情况下,找不到解决方案, 例如V2.11.0.0可能吗?如果是这样,那么V2.5.0.0是更低版本还是更高版本? 如果将2.11.0.0转换为小数2.11,则它将低于2.5 在我认为是版本号的默认解释中,你没有一个数字,但你必须连续比较4个数字才能得到结果。
解析版本中的数字的许多方法之一将是:
declare @EntryValue varchar(250)='V2.0.0.0 VersionData'
;with cte as
(
select charindex('.',@EntryValue) p1
,charindex('.',@EntryValue,charindex('.',@EntryValue)+1) p2
,charindex('.',@EntryValue,charindex('.',@EntryValue,charindex('.',@EntryValue)+1)+1) p3
,charindex(' ',@EntryValue) p4
)
select substring(@EntryValue,2,p1-2)+0 [MajorVersion]
,SUBSTRING(@EntryValue,p1+1,p2-p1-1)+0 [MinorVersion]
,SUBSTRING(@EntryValue,p2+1,p3-p2-1)+0 [BugFixRelease]
,SUBSTRING(@EntryValue,p3+1,p4-p3-1)+0 [Build]
from cte
如果数字不能大于10,那么你有一个简单的任务,那么你可以只使用一个简单的比较
select case when 'V2.1.0.0 VersionData'>= 'V2.0.1.0 VersionData' then 1 else 0 end
由于字符的字典顺序可以确保结果是正确的。
- 在编辑中添加
如果您的版本中最多有4个数字,那么您可以滥用内部函数PARSENAME以更简单的方式获取数字:
declare @EntryValue varchar(250)='V2.0.0.0 VersionData'
select
parsename(stuff(left(@EntryValue,charindex(' ',@EntryValue)),1,1,''),4)+0 MajorVersion
, parsename(stuff(left(@EntryValue,charindex(' ',@EntryValue)),1,1,''),3)+0 MinorVersion
, parsename(stuff(left(@EntryValue,charindex(' ',@EntryValue)),1,1,''),2)+0 Release
, parsename(stuff(left(@EntryValue,charindex(' ',@EntryValue)),1,1,''),1)+0 Build
答案 1 :(得分:0)
一个问题是,转换包含多个.
字符的字符串' 2.0.1.0'将无法正确转换为2010
(如您所愿)。< / p>
但是,如果您可以保证您总是拥有4个版本的部分且每个版本部分都在0..9
之间,那么就没有像2.0.11.0' or
2.0.1.0.9&#这样的版本39;,那么以下解决方案应该有效。它只是依赖于字符串值的顺序,上面提到的有关版本部分保证的限制 - 就像你比较积分值一样:
with versions as
( select entryValue, Substring(LEFT(EntryValue,
CHARINDEX(' ', EntryValue)),2,100) as versionStr
from (values
('V2.0.0.0 some older version'),
('V2.0.1.0 sufficient version'),
('V2.0.1.9 newer version')
) as versionTable(entryValue)
)
select *, (case when versionStr >= '2.0.1.0' then 'Pass' else 'Fail' end) as "check"
from versions;