Sql 获取第一个值和最后一个值

Sql 获取第一个值和最后一个值,sql,string,oracle,Sql,String,Oracle,我有下面的记录,如“8 | 12 | 53 | 123 | 97”,我需要找到8到97之间的值范围,因此我需要数字8和97。您可以使用REGEXP|u SUBSTR,如下所示: ^匹配字符串的开头。 $匹配字符串的结尾。 干杯 您可以使用REGEXP\u SUBSTR,如下所示: ^匹配字符串的开头。 $匹配字符串的结尾。 干杯 这是一个解决方案,适用于至少有一根管道的任何管柱 with cte as ( select '8|12|53|123|97' str from dual ) ,

我有下面的记录,如“8 | 12 | 53 | 123 | 97”,我需要找到8到97之间的值范围,因此我需要数字8和97。

您可以使用REGEXP|u SUBSTR,如下所示:

^匹配字符串的开头。 $匹配字符串的结尾。 干杯

您可以使用REGEXP\u SUBSTR,如下所示:

^匹配字符串的开头。 $匹配字符串的结尾。
干杯

这是一个解决方案,适用于至少有一根管道的任何管柱

with cte as (
  select '8|12|53|123|97' str from dual
  )
, rng as (  
select to_number(substr(str, 1, instr(str, '|')-1)) as token_1
      ,to_number(substr(str, instr(str, '|', -1)+1)) as token_2
from cte )
select token_1 + level - 1 as tkn
from rng
connect by level <= (token_2 - token_1) + 1
/
第一个子查询只是您的测试数据。第二个子查询标识字符串中的第一个数字标记_1和最后一个数字标记_2。它使用substr和instr只是因为它们比正则表达式快。带有负偏移量的instr查找搜索参数的最后一次出现

主查询根据rng子查询的边界生成一系列数字。不确定这是否在您的需求中取决于您所指的值范围


由于此模型不在中,您将面临数据质量问题。如果第一个或最后一个标记不是数字,或者只有一个标记,或者分隔符不是管道,则查询将不会生成结果。

以下是一个解决方案,它适用于至少有一个管道的任何字符串

with cte as (
  select '8|12|53|123|97' str from dual
  )
, rng as (  
select to_number(substr(str, 1, instr(str, '|')-1)) as token_1
      ,to_number(substr(str, instr(str, '|', -1)+1)) as token_2
from cte )
select token_1 + level - 1 as tkn
from rng
connect by level <= (token_2 - token_1) + 1
/
第一个子查询只是您的测试数据。第二个子查询标识字符串中的第一个数字标记_1和最后一个数字标记_2。它使用substr和instr只是因为它们比正则表达式快。带有负偏移量的instr查找搜索参数的最后一次出现

主查询根据rng子查询的边界生成一系列数字。不确定这是否在您的需求中取决于您所指的值范围


由于此模型不在中,您将面临数据质量问题。如果第一个或最后一个标记不是数字,或者只有一个标记,或者分隔符不是管道,则查询不会生成结果。

切勿在一列中存储多个值。改变你的桌子设计!这是一个字符列,我只想拆分它,这样我就可以处理第一个值(8)和最后一个值(97)之间的范围。幸运的是,这样存储数据只会给你带来问题。这种结构不适用。我知道正确的数据建模很枯燥而且不流行,但它确实可以防止像这样的棘手问题。永远不要在一列中存储多个值。改变你的桌子设计!这是一个字符列,我只想拆分它,这样我就可以处理第一个值(8)和最后一个值(97)之间的范围。幸运的是,这样存储数据只会给你带来问题。这种结构不适用。我知道正确的数据建模很枯燥,并不流行,但它确实可以避免像这样的棘手问题。