我只会在数据库里写存储过程返回你所需要的动态字符串,代码中调用存储过程就好了
如下:
--测试环境
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将字段拆分:内容如下等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)