SQL字段拆分的问题

SQL字段拆分的问题,第1张

我只会在数据库里写存储过程返回你所需要的动态字符串,代码中调用存储过程就好了

如下:

--测试环境

CREATE

TABLE

TEST(ID

INT

,QL

VARCHAR(20))

--测试数据

INSERT

INTO

TEST

SELECT

1,'111AAA'

UNION

ALL

SELECT

1,'222BBB'

UNION

ALL

SELECT

2,'QQQQQ'

UNION

ALL

SELECT

1,'111CCC'

--查询

SELECT

FROM

TEST

/以下存储过程先把包含'111'的字段拼接到@STR中,格式为:'111AAA,111CCC',然后再拆分字符串生成动态HTML字符串/

---1生成动态字符串的存储过程设计

CREATE

PROC

P_SELECT

AS

DECLARE

@I

INT,@STR

VARCHAR(100)

SET

@I=1

--获取表内包含'111'的记录动态拼接到@STR中

SELECT

@STR=ISNULL(@STR+',','')+QL

FROM

TEST

WHERE

QL

LIKE

'111%'

SET

@STR=@STR+','

--定义临时表变量用来存储字符串

DECLARE

@TB

TABLE(STRING

VARCHAR(MAX))

DECLARE

@STRING1

VARCHAR(20)

--临时存放生成的字符串

--循环生成动态字符串

WHILE

CHARINDEX(',',@STR)>0

BEGIN

SET

@STRING1=LEFT(@STR,CHARINDEX(',',@STR)-1)

INSERT

INTO

@TB

SELECT

'<a

target="_blank"

href="111"><img

src="K'+CONVERT(VARCHAR(3),@I)+

+'jpg"

/>111<B>'+

RIGHT(@STRING1,LEN(@STRING1)-3)+'</B></a>'

--@I自增

SET

@I=@I+1

SET

@STR=RIGHT(@STR,LEN(@STR)-CHARINDEX(',',@STR))

END

--查询表变量中存放的生成的动态字符串

SELECT

FROM

@TB

--测试存过

EXECUTE

P_SELECT

/执行结果,表变量中生成的动态字符串:

STRING

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

<a

target="_blank"

href="111"><img

src="K1jpg"

/>111<B>AAA</B></a>

<a

target="_blank"

href="111"><img

src="K2jpg"

/>111<B>CCC</B></a>

(2

行受影响)

/

--删除测试环境

DROP

PROC

P_SELECT

DROP

TABLE

TEST

那是因为条件 substr(money,1,length(money=6)=1) = '人民币' 没有符合条件的数据,所以是null,你用 select substr(money,1,length(money=6)=1) , from table 看看是什么结果,一般判断字符串里是否保护某些字符,应该用charindex函数才对的。

drop table   zz_test 

create table zz_test (id varchar(200) ,nr varchar(405))

insert zz_test

select '内容:',   '1、直肠高 2、急性 3、陈旧 4、高血 5、结肠 6、慢性'

select  aid ,

nr=substring(anr,bnumber,charindex(' ',anr+' ',bnumber)-bnumber)

from zz_test a

join masterspt_values b on btype='P'

where charindex(' ',' '+anr,bnumber)=bnumber

运行结果:

可以拆分的前提是你存储必须是有规律的,否则拆分不出来。比如这个:中间我用一个空格来隔开的。

with temp as

(

select name as text from a

)

select substr(text,instr(text,',',1,rn)+1,instr(text,',',1,rn+1)-instr(text,',',1,rn)-1) text from

(

select ','||t1text||',' text,t2rn from

(select text,length(text)-length(replace(text,',',''))+1 rn from temp) t1,

(select rownum rn from all_objects where rownum <= (select max(length(text)-length(replace(text,',',''))+1) rn from temp)) t2

where t1rn >= t2rn order by text,rn

)

用这种方法可以处理name这一列,如果你想ID、NAME都先显示的话,就要写成一个函数来调用了。

如果ID和内容是以空格分隔的,那么就这么写

select

left(m_content,charindex('

',m_content)-1)

as

ID,stuff(m_content,1,charindex('

',m_content),'')

as

content

from

当然,如果记录中有不完全按照id+空格+内容这样的,语句可能会有问题。

“向substring函数传递了无效的length参数”正是因为m_content中包含不符合"id+空格+内容"的数据

你可以用

select

from

where

m_content

not

like

'%

%'

or

m_content

is

null

来找出这样的行。

另外我给你的语句是让你做参考的,你首先知道用到的函数是什么意思才可以。

举个例子,这是itxxza表中的数据

分割后的运行结果:

select func_split_string(a,b) result, t from itxxza t

执行后均为success,则说明我们分割成功,这时再看下itxxzb表中数据:

具体实现可参考:itxxzcom/mysql/2015/0114/mysql_splithtml

以上就是关于SQL字段拆分的问题全部的内容,包括:SQL字段拆分的问题、数据库的表中写一个sql把已有字段对应的值 拆分为多个字段、sql server将字段拆分:内容如下等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9351834.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存