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

How to select start from partial text ,end with value range SQL

我有一个文本列表,其中包含列调用中的值 "Name"

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

想要 select 从 从 J0016xx 开始到 J0017xx 的范围, 我怎样才能做到这一点?除了下面的方法:

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

欢迎使用常规 SQL 和 Regex 方式。

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'

(1) 基于 LIKE 运算符和 _ 正好代表一个字符:

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

(2) 基于字符串的字母数字排序,这也有效,但不能确保在指定文本后还有两个字符:

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

(3) 使用 REGEXP_LIKE Oracle 函数进行区分大小写的搜索:

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

解释:

  • ^J001 - 以 J001
  • 开头
  • [67] - 下一个字符为 6 或 7
  • .{2}$ - 恰好以两个字符结尾

我个人会选择 (1) 或 (3),因为只要您需要修改条件(例如,字符串中的数字,因为 (2) 可能会中断并且需要您),它更可靠更改参数位置)。如果您正在考虑便携性,那么 (1) 中的 LIKE 是更好的选择,因为 (3) 是特定于产品的。

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

我不知道您使用的是哪个 RDMS。我可以根据您的 RDBMS 对其进行修改。以下查询将在 SQL 服务器

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

最好的方法是:

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

为什么是"best"?首先,它 returns 正确的价值观并且没有误导。使用 BETWEEN 会产生误导,因为 'J0018' 会包含在结果中(尽管如果有任何其他字符则不会)。

其次,优化器可以利用索引(如果可用)进行查询。