代码之家  ›  专栏  ›  技术社区  ›  Kevin

SQL-版本比较

  •  0
  • Kevin  · 技术社区  · 6 年前

    这是我的第一个问题。

    我正在构建一个SQL查询,需要验证对象B的版本始终低于或等于对象A的版本。这是一个链接表,下面是一个示例:

    Image path

    查询是:

    SELECT *
    FROM TABLE
    WHERE B_VERSION <= A_VERSION
    

    如您所见,它适用于前两行,但不适用于第三行,因为AA0被检测到小于H08,而它不应该小于H08(当我们到达Z99时,下一个版本号是AA0,因此<=操作符不再工作)。

    因此,我想对版本进行解析,比较版本中的字母数量,只有当两个版本的字母数量相同时,我才使用<=操作人员

    然而,我不知道如何在SQL查询中做到这一点。也没有在谷歌上找到任何有用的东西。你有解决办法吗?

    提前感谢

    2 回复  |  直到 6 年前
        1
  •  0
  •   Juan C. Garcia    6 年前

    解决这个问题的关键是函数 PATINDEX公司 . 您可以找到更多信息 here .

    此查询采用A\U版本的值,并查找第一个出现的数字。然后使用此位置将值分为两部分。第一部分右侧填充空格,因为它是字母,而第二部分右侧填充零(“0”),因为它是数字。

    对于B\U版本,也会发生相同的过程。

    注意,在本例中,假设每个部分都是最大的 5. 字符,因此这将适用于从A0到ZZZZZ 99999的版本。您可以根据需要自由调整。

    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) 
    

    如果要在许多地方执行此操作,可以考虑为此操作创建一个函数。

    希望这有帮助。

        2
  •  0
  •   Kevin    6 年前

    非常感谢!这帮了我很大的忙,但我使用的是sql developer,而我不能将PATINDEX与此软件一起使用,我找到了等效的REGEXP\u INSTR,它的工作原理非常相似。

    我使用了这个算法,过滤掉VERSION\u B中的字母数比VERSION\u A中的字母数多的行,然后过滤掉VERSION\u B中的字母数比VERSION\u 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)