我正在更新要求。基本上一个字符串可以有2或3或4位小数位,而不是两位小数,如下所示。
假设我在列名“Version”中有一个带逗号分隔字符串的记录
假设我们有一个记录(A),其中包含在“版本”列中包含这些值
Version = 10.1.2.4,10.4.3.4,11.6.0,(该列有逗号分隔的字符串)
我正在传递一个名为@VersionCheck
的sql参数IF @VersionCheck = 11.6.0且版本没有像11.5.6这样的值(注意11与11.6.0中的11匹配)
我想要退回记录
所以这里有一些例子都与参数@ VersionCheck = 11.6.0
进行比较版本= 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.something开头的字符串不等于11.6.0 (参数传递)我们返回此记录)
版本= 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)
)
答案 0 :(得分:3)
由于您的设计基本上阻止了任何尝试在Version列上使用索引,这将为您提供完全匹配的行
...
WHERE ',' + Version + ',' LIKE '%,' + @VersionCheck + ',%'
对于你有的时髦要求,试试这个(假设所有版本字符串都包含两个小数位):
DECLARE @v TABLE(Version VARCHAR(MAX));
INSERT @v SELECT ('10.1.2,10.4.3')
UNION ALL SELECT ('10.1.2,10.4.3,11.6.0')
UNION ALL SELECT ('10.1.2,10.4.3,11.5.2');
DECLARE @SU_Version VARCHAR(32);
SET @SU_Version = '11.6.0';
DECLARE
@p1 VARCHAR(10),
@p2 VARCHAR(10);
SELECT
@p1 = PARSENAME(@SU_Version, 3),
@p2 = PARSENAME(@SU_Version, 2);
SELECT Version = SUBSTRING(Version, 2, LEN(Version)-2) FROM
(
SELECT Version = ',' + Version + ',' FROM @v
) AS v WHERE
(
Version LIKE '%,' + @SU_Version + ',%'
OR
Version NOT LIKE '%,' + @p1 + '.%,%'
AND NOT
(
Version LIKE '%,' + @p1 + '.%,%'
AND
Version NOT LIKE '%,' + @p1 + '.' + @p2 + '.%,%'
)
);