这是我的第一个问题。
我正在构建一个SQL查询,我需要验证对象B的版本是否总是低于或等于对象A的版本。这是一个链接表,这是一个例子:
查询是:
SELECT *
FROM TABLE
WHERE B_VERSION <= A_VERSION
正如你所看到的,它适用于2个第一行,但不适用于第3行,因为AA0被检测为小于H08而它不应该(当我们到达Z99时,下一个版本号是AA0所以&lt; =操作员不再工作了。)
所以我想做一些类似于解析版本以比较它们在版本中的字母数量的东西,并且只有当两个版本具有相同数量的字母时,我才使用&lt; =运算符。
但我不知道如何在SQL查询中执行此操作。没有在谷歌上找到任何有用的东西。你有解决方案吗?
提前致谢
答案 0 :(得分:0)
解决此问题的关键是函数 PATINDEX 。您可以找到更多信息here。
此查询获取A_VERSION的值并查找第一次出现的数字。然后使用此位置将值分为两部分。第一部分用空格填充到右边,因为它是字母的,而第二部分用零填充到右边(&#39; 0&#39;),因为它是数字。
B_VERSION也会发生相同的过程。
注意到在此示例中,假设每个部分都具有最大 5 字符,因此对于从A0到ZZZZZ99999的版本,这将适用于您的情况。您可以根据需要随意调整。
SELECT *
FROM TABLE
WHERE RIGHT(SPACE(5)
+ SUBSTRING(A_VERSION,
1,
PATINDEX('%[0-9]%', A_VERSION) - 1), 5)
+ RIGHT(REPLICATE('0', 5)
+ SUBSTRING(A_VERSION,
PATINDEX('%[0-9]%', A_VERSION),
LEN(A_VERSION)), 5)
<= RIGHT(SPACE(5)
+ SUBSTRING(B_VERSION,
1,
PATINDEX('%[0-9]%', B_VERSION) - 1), 5)
+ RIGHT(REPLICATE('0', 5)
+ SUBSTRING(B_VERSION,
PATINDEX('%[0-9]%', B_VERSION),
LEN(B_VERSION)) ,5)
如果要在许多地方执行此操作,可以考虑为此操作创建一个函数。
希望这有帮助。
答案 1 :(得分:0)
非常感谢!它帮了很多但是我使用sql开发人员并且我不能使用PATINDEX这个软件,我找到了等效的REGEXP_INSTR,它的工作方式非常相似。
我使用这个算法过滤掉VERSION_B中比VERSION_A更多字母的行,然后当它们具有相同数量的字母时过滤掉VERSION_B大于VERSION_A的行:
WHERE
(REGEXP_INSTR(VERSION_B, '[0-9]') < REGEXP_INSTR(VERSION_A, '[0-9]')) OR
(REGEXP_INSTR(VERSION_B, '[0-9]') = REGEXP_INSTR(VERSION_A, '[0-9]') AND VERSION_B <= VERSION_A)