【问题标题】:SQL Using LIKE with wildcard in CASE with value boundariesSQL 在具有值边界的 CASE 中使用 LIKE 和通配符
【发布时间】:2019-01-08 14:29:57
【问题描述】:

我尝试搜索了很长时间,但所有答案并没有真正让我到任何地方。

我正在尝试编写一个 SQL 查询,我需要将某些值映射到具有通配符的新组,在某些边界之间这看起来像这样:

SELECT number,
CASE
    WHEN number >= LIKE '0' AND number <= LIKE '009%' THEN 'group 1'
    WHEN number >= LIKE '010%' AND number <= LIKE '027%' THEN 'group 2'
    ELSE '0'
END AS NEW_GROUPS

这是必要的,因为数字可能类似于 00923 和 00811,它们需要属于第一类。因为 010.123、010123 和 0270 需要在第二个。

如果这样的事情真的不可能,那么在 Python 中使用带有字典的 map 方法也是一种选择(类似于:

df['number'].map({..})

但我不确定如何在此处使用 lambda/regex/wildcard。 非常感谢您的帮助!

【问题讨论】:

  • 您使用的是哪个 SQL 数据库?即使在“相同”RDBMS 的版本之间,字符串格式也有很大不同。如果您真的试图找到通用解决方案 - 至少编写您想要的标准(SQL-89/ SQL-92/../SQL-2016)
  • 而不是进行这种 SQL 查询;使用简单的查询来检索信息并使用 pandas 来执行数据操作。当您拥有大量数据时,这将是一个理想的解决方案。在这种情况下,复杂的 sql 查询会花费更长的时间。 stackoverflow.com/questions/19913659/…

标签: python sql sql-like


【解决方案1】:

如果数字实际上是一个数字列,那么您可以进行直接比较。否则 我会使用以下内容来获得您想要的东西。它有点不同,但我认为它符合您的需求

case
    When LEN(number)<3 or Cast(Left(Number,3) as Int) < 10 Then 'Group 1'
    When Cast(Left(Number,3) as Int) < 28 Then 'Group 2'

您可能需要针对边缘情况进行 tweek 处理,但我认为这可以理解。

【讨论】:

    【解决方案2】:

    你在寻找这样的东西吗?

    SELECT number,
           (CASE WHEN number >= '00' AND number < '01' THEN 'group 1'
                 WHEN number >= '01' AND number <= '027' THEN 'group 2'
                 ELSE '0'
            END) as new_group
    

    第一组将以“00”开头的数字。第二个将是以该范围内按字母顺序排列的值开头的数字。 “按字母顺序”表示“01A”将满足条件。

    【讨论】:

    • 我比我更喜欢你的解决方案
    • 啊,这实际上可能会做到。我想得太难了。在我看来,数字 00123 将转换为 123,但这些当然是字符串。我试试,谢谢
    • 说真的,你会推荐运行这样的查询吗?虽然这是这个问题的正确答案。这不是最佳答案。
    • @JRibkr 。 . .我不知道你指的是什么。如果逻辑确实正确,我会使用这样的查询。
    • 如果你站在 OP 的立场上,并且目标数据库有大量的记录;你会选择你的解决方案吗?处理这个问题的正确方法是使用简单的查询将数据加载到 pandas 数据框中,然后根据需要对其进行操作。
    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多