我正在更新要求..基本上一个字符串可以有 2 位或 3 位或 4 位小数位而不是两位小数位,如下所示。
假设我在列名“版本”中有一条以逗号分隔的字符串的记录
假设我们有一条记录 (A),在其“版本”列中包含这些值
Version=10.1.2.4, 10.4.3.4,11.6.0, (该列有逗号分隔的字符串)
我正在传递一个名为 @VersionCheck 的 sql 参数
IF @VersionCheck = 11.6.0 并且 Version 没有像 11.5.6 这样的任何值(注意 11 与 11.6.0 中的 11 匹配)
我要退回记录
所以这里有一些例子都与参数 @VersionCheck= 11.6.0 进行比较
Version=10.1.2,10.4.3.45 返回这条记录
Version=10.1.2,10.4.3,10.4.4.5,11.6.0 返回这条记录(如果我们有一个匹配 11.6.0 并且没有以 11 开头的字符串。不等于 11.6.0 的东西(参数传递)我们返回这个记录)
Version= 10.1.2,10.4.3,11.6.0.2 不返回这条记录(要检查,取第一个小数点之前的字符串,在这种情况下是11,但是11.6.0.2和11.6.0不一样所以它不应该匹配)
如何编写 sql 查询以在 where 子句中包含此逻辑?如果传递的参数是@VersionCheck = 10.6.8,我不希望它匹配如果逗号分隔列中的字符串说 10.5.4 基本上取第一个小数点之前的字符并且它们相等(10 = 10),它的其余值必须相同,否则它不应该匹配。
这是我在 sql server 2008 语法中的解决方案
请注意,@SU_Version 是我的参数
并且 SuVersion.fieldValue 是具有逗号分隔字符串值的列,例如 10.1.2,10.3.4 等
WHERE (CASE WHEN '%@SU_Version%' <> '' AND suVersion.fieldValue LIKE LTRIM('@SU_Version')
THEN suVersion.fieldValue
ELSE '%'
END like CASE WHEN '%@SU_Version%' <> ''
THEN '%@SU_Version%'
ELSE '%'
END
AND
(CASE WHEN LTRIM('@SU_Version') <> '' AND suVersion.fieldValue LIKE SUBSTRING(LTRIM('@SU_Version'),1, CHARINDEX( '.',LTRIM('@SU_Version'))-1)
THEN suVersion.fieldValue
ELSE'%'
END not like CASE WHEN LTRIM('@SU_Version')<> ''
THEN SUBSTRING(LTRIM('@SU_Version'),1, CHARINDEX( '.',LTRIM('@SU_Version'))-1) + '%'
ELSE '%'
END
AND
CASE WHEN LTRIM('@SU_Version') <> '' AND suVersion.fieldValue LIKE SUBSTRING(LTRIM('@SU_Version'),1, CHARINDEX( '.',LTRIM('@SU_Version'))-1)
THEN suVersion.fieldValue
ELSE'%'
END not like CASE WHEN LTRIM('@SU_Version')<> ''
THEN SUBSTRING(LTRIM('@SU_Version'),1, CHARINDEX( '.',LTRIM('@SU_Version'))-1) + '%'
ELSE '%'
END)
)