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

如何选择从部分文本开始,以值范围结束SQL

  •  1
  • rane  · 技术社区  · 6 年前

    我有一个包含“Name”列中的值的文本列表

    Name
    J001500
    J001510
    J001520
    J001600
    J001610
    J001620
    J001700
    J001710
    J001720
    J001800
    J001810
    J001820
    

    希望从范围中选择 , 我怎样才能做到这一点?以下方法除外:

    WHERE Name BETWEEN 'J0016%' AND 'J0017%'
    ORDER by Name
    

    欢迎使用普通的SQL和Regex方式。

    4 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    最好的方法是:

    WHERE Name >= 'J0016' AND Name < 'J0018'
    

    为什么这是“最好的”?首先,它返回正确的值,不会产生误导。使用 BETWEEN 'J0018' 将包含在结果中(但如果有任何其他字符则不会)。

        2
  •  2
  •   hotfix Itesh Simlai    6 年前
    with test as (select 'J001500' as name from dual union
                  select 'J001510' from dual union
                  select 'J001520' from dual union
                  select 'J001600' from dual union
                  select 'J001610' from dual union
                  select 'J001620' from dual union
                  select 'J001700'   from dual union
                  select 'J001710' from dual union
                  select 'J001720'  from dual union
                  select 'J001800' from dual union
                  select 'J001810'  from dual union
                  select 'J001820'   from dual)
    --select * from test where name >= 'J0017' and name < 'J0018'
    select * from test where name between 'J0017' and 'J0018'
    
        3
  •  2
  •   Kamil Gosciminski    6 年前

    (一) 基于 LIKE 操作员和 _ 只代表一个字符:

    WHERE Name LIKE 'J0016__' OR Name LIKE 'J0017__'
    

    (二) 基于字符串的字母数字排序,这也可以工作,但不能确保指定文本后面还有两个字符:

    WHERE Name BETWEEN 'J0016' AND 'J0018' -- note 18 here which means < 'J0018'
    

    (三) 使用 REGEXP_LIKE 带区分大小写搜索的Oracle函数:

    WHERE REGEXP_LIKE(Name, '^J001[67].{2}$','c')
    

    • ^J001 -从J001开始
    • [67] -下一个字符是6或7
    • .{2}$ -以两个字符结尾

    我个人会选择(1)或(3)只是因为当你需要修改条件时(例如字符串中的数字,因为(2)可能会中断,需要你更改参数的位置),它会更防弹。如果你考虑的是可移植性的话 就像

        4
  •  1
  •   Prahalad Gaggar    6 年前

    逻辑:提取字符串中的第4和第5个字符,如果它在16和17之间,则将其作为输出。

    SELECT *
    FROM table
    WHERE CONVERT(INT,SUBSTRING(name,4,2)) BETWEEN '16' AND '17'
    ORDER by Name