数据库 遍历字符串

转载 2007年10月15日 13:58:00
   遍历字符串

问题

遍历一个字符,并将其中的每个字符都作为一行返回,但是SQL没有循环操作。例如,要将表EMP中ENAME值为“KING”的字符串显示为4行,每行中都包含“KING”中的一个字符。

解决方案

使用笛卡儿积来生成行号,用来在该行中返回字符串中的每个字符。然后,使用DBMS中的内置的字符串分析函数来摘出所要显示的字符(SQL Server用户可使用SUBSTRING代替SUBSTR):

1 select substr(e.ename,iter.pos,1) as C

2   from (select ename from emp where ename = 'KING') e,

3        (select id as pos from t10) iter

4  where iter.pos <= length(e.ename)

C

-

K

I

N

G

讨论

逐一访问字符串中字符的关键是,所联接的表要有足够的行来得到所需要的反复次数。例中所用的表为T10,该表包含10行(该表有ID列,其中存储了数字1_10)。示例查询中能够返回的行数最大为10。

下面的例子显示了没有分解ENAME时在E和ITER(也就是说,指定的姓名和T10中这10行)的笛卡儿积:

select ename, iter.pos

  from (select ename from emp where ename = 'KING') e,

       (select id as pos from t10) iter

ENAME             POS

---------- ----------

KING                1

KING                2

KING                3

KING                4

KING                5

KING                6

KING                7

KING                8

KING                9

KING               10

内联视图的基数为1,而内联视图ITER的基数为10,所以笛卡儿积为10行。生成这样的结果是在SQL中进行循环的第一步。

注意:    一般情况下,将表T10称为“基干1”表。

解决方案使用WHERE子句在返回4行之后,跳出循环。为限定结果集的行数与在姓名中所包含的字符数相同,所以在其中定义WHERE子句用了ITER.POS <= LENGTH(E.ENAME)作为条件:

select ename, iter.pos

  from (select ename from emp where ename = 'KING') e,

       (select id as pos from t10) iter

 where iter.pos <= length(e.ename)

ENAME             POS

---------- ----------

KING                1

KING                2

KING                3

KING                4

现在,对于在E.ENAME中的每个字符都有对应的一行,可以使用ER.POS作为SUBSTR的参数,在字符串中操作这些字符。ITER.PRS每行都在增加,这样,每行都会返回E.ENAME中的下一个字符。这也就是示例解决方案的工作原理。

根据所要实现的目标,可以决定是否需要对在字符串中每个字符都生成单独的一行。下面的例子是要遍历E.ENAME,并且显示字符串中的各个部分(超过1个字符):

select substr(e.ename,iter.pos) a,

       substr(e.ename,length(e.ename)-iter.pos+1) b

  from (select ename from emp where ename = 'KING') e,

       (select id pos from t10) iter

 where iter.pos <= length(e.ename)

A          B

---------- ------

KING       G

ING        NG

NG         ING

G          KING

本章中的多数解决方案都有共同的部分,例如将整个字符串中的每个字符拆分为一行,或者根据字符串中特殊字符或分隔符的数量产生相应数量的行。

指针遍历字符串—华为机试题

9月5日,华为2014校园招聘的机试题目 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 压缩规则:   ...
  • u013147914
  • u013147914
  • 2014年02月25日 00:27
  • 845

Java 正确遍历字符串

Java字符串是一系列的Unicode字符序列,但是,它却常常被误认为是char序列。于是,我们经常这样来遍历字符串: package testchar; public class TestChar...
  • l294265421
  • l294265421
  • 2015年08月04日 19:55
  • 21609

【Linux C】关于遍历字符串的三种方法

在这里我们重点介绍遍历字符串的三种方法。
  • newcong0123
  • newcong0123
  • 2016年07月15日 20:27
  • 854

字符串的遍历

Java字符串是一系列的Unicode字符序列,但是,它却常常被误认为是char序列。于是,我们经常这样来遍历字符串: [java] view plaincopy ...
  • unique_wz
  • unique_wz
  • 2015年08月15日 10:50
  • 887

shell中遍历字符串

最近系统学习了shell编程. 看到书本里面的一个例子,很屌.之前自己也想过,但是没有得到结果. 相信同学们也猜到这个例子了,就是一行字符串的拆分.在看答案之前,同学们可以自己尝试一下. 这里我总结了...
  • cp3alai
  • cp3alai
  • 2015年02月09日 18:24
  • 3690

字符串的while()循环遍历

下面是两种遍历字符串时的while()循环 char *str1 = "abcdefg"; char *str2 = "abcdefg"; //第一种遍历 while (*(str++)) { ...
  • yykebeibei
  • yykebeibei
  • 2016年04月16日 16:48
  • 1013

c语言遍历字符串数组的方法

在这里我们重点介绍遍历字符串的三种方法。   首先我们来看一道编程题目:   输入一个字符串,且都是数字,也可以是负数,转化成相应的整型数并输出,若输入字母则停止。   ...
  • nopoppy
  • nopoppy
  • 2016年09月21日 22:08
  • 6032

遍历字符串数组的三种fangfa

在这里我们重点介绍遍历字符串的三种方法。   首先我们来看一道编程题目:   输入一个字符串,且都是数字,也可以是负数,转化成相应的整型数并输出,若输入字母则停止。   ...
  • nopoppy
  • nopoppy
  • 2016年07月16日 15:41
  • 2343

快速掌握Lua 5.3 —— 字符串库 (2)

Q:模式匹配字符串的相关函数? A: --[[ string.find(s, pattern [, init [, plain]]) 在字符串"s"中查找第一个与匹配模式"patte...
  • VermillionTear
  • VermillionTear
  • 2016年02月21日 13:53
  • 1542

swift 4. 字符串

swift 4. 字符串标签:swift2. 用前缀或后缀法比较字符串用hasPrefix和hasSuffix这2个字符串的对象方法,来判断和比较,他们返回boolean值的true或falsely看...
  • yangyi2083334
  • yangyi2083334
  • 2016年09月03日 17:55
  • 2799
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库 遍历字符串
举报原因:
原因补充:

(最多只允许输入30个字)