请教一个字符串拆分的问题
请教一个字符串拆分的问题,
问题如下:
将下列字符串 "14321A#14532B#,12344A#14756C " 拆分成
14321 A
14532 B
12344 A
14756 C
的形式
[解决办法]
如何将 '2006-01-12|2006-02-13|2006-03-15|2006-11-11|2003-1-1 '按 '| '分割成
2006-01-12
2006-02-13
2006-03-15
2006-11-11
2003-1-1
declare @Days varchar(4000)
declare @tmpDay varchar(10)
set @Days= '2006-01-12|2006-02-13|2006-03-15|2006-11-11|2003-1-1 '
set @tmpDay= ' '
declare @i int
set @i=0
while @i <len(@Days)
begin
set @i=@i+1
if SUBSTRING(@Days,@i,1)= '| '
begin
print left(@Days,@i-1)
set @Days=SUBSTRING(@Days,@i+1,len(@Days))
set @i=0
end
end
print @Days
输出结果:
2006-01-12
2006-02-13
2006-03-15
2006-11-11
2003-1-1
一字段信息包括如下:李三|李三@d.com|公司|单位地址|
我将查询用(Select)只列出李三及单位地址的方法?
create table #t(c1 varchar(100))
insert into #t select 'li4|33@com|mircrosoft|china| '
insert into #t select 'zhang3|zhang3@163.com|IBM|USA| '
insert into #t select '李三|李三@d.com|公司|单位地址| '
select substring(c1,1,charindex( '| ',c1)-1) as name,
reverse(substring(reverse(c1) , 2 , charindex( '| ' , reverse(c1) , 2) - 2)) as address from #t
drop table #t
name address
----- -------
li4 china
zhang3 USA
李三 单位地址
(所影响的行数为 3 行)
[解决办法]
CREATE TABLE A(id INT,country VARCHAR(100))
INSERT A
SELECT 1, '中国;日本;韩国 ' UNION ALL
SELECT 2, '美国;意大利;法国 ' UNION ALL
SELECT 3, '德国 '
SELECT * FROM A
-- 建立一个辅助的临时表就可以了
SELECT TOP 8000 id = identity(int,1,1)
INTO # FROM syscolumns a, syscolumns b
SELECT
A.ID,
COUNTRY = SUBSTRING(A.COUNTRY, B.ID, CHARINDEX( '; ', A.COUNTRY + '; ', B.ID) - B.ID)
FROM A, # B
WHERE SUBSTRING( '; ' + a.COUNTRY, B.id, 1) = '; '
ORDER BY 1,2
GO
DROP TABLE A,#
id country
----------- ----------------
1 中国;日本;韩国
2 美国;意大利;法国
3 德国
(所影响的行数为 3 行)
ID COUNTRY
----------- ---------
1 韩国
1 日本
1 中国
2 法国
2 美国
2 意大利
3 德国
(所影响的行数为 7 行)
[解决办法]
if exists (select * from dbo.sysobjects where id = object_id(N '[dbo].[f_splitSTR] ') and xtype in (N 'FN ', N 'IF ', N 'TF '))
drop function [dbo].[f_splitSTR]
GO
CREATE FUNCTION dbo.f_splitSTR(
@s varchar(8000), --要分拆的字符串
@split varchar(10), --数据分隔符
@pos int -- 取第几个
)RETURNS varchar(100)
AS
BEGIN
DECLARE @splitlen int, @re varchar(100)
SET @splitlen=LEN(@split+ 'a ') - 2
WHILE CHARINDEX(@split,@s) > 0 AND @pos > 0
SELECT
@re = LEFT(@s,CHARINDEX(@split,@s)-1),
@s=STUFF(@s,1,CHARINDEX(@split, @s)+@splitlen, ' '),
@pos = @pos - 1
RETURN(CASE
WHEN @pos = 0 THEN @re
WHEN @pos = 1 THEN @s
ELSE NULL END)
END
GO
-- 调用
SELECT
dbo.f_splitSTR(userinfo, '# ', 1) as c1,
dbo.f_splitSTR(userinfo, '# ', 2) as c2,
dbo.f_splitSTR(userinfo, '# ', 3) as c3,
dbo.f_splitSTR(userinfo, '# ', 4) as c4
FROM(
SELECT userinfo = '14321A#14532B#12344A#14756C '
)A
[解决办法]
declare @Days varchar(4000)
declare @tmpDay varchar(10)
set @Days= '14321A#14532B#12344A#14756C '
set @tmpDay= ' '
declare @i int
set @i=0
while @i <len(@Days)
begin
set @i=@i+1
if SUBSTRING(@Days,@i,1)= '# '
begin
print substring(left(@Days,@i-1),1,5) + ' ' + substring(left(@Days,@i-1),6,1)
set @Days=SUBSTRING(@Days,@i+1,len(@Days))
set @i=0
end
end
print substring(@Days,1,5) + ' ' + substring(@Days,6,1)
14321 A
14532 B
12344 A
14756 C
只是你中间还多个逗号?
[解决办法]
Create FUNCTION fn_GetCutStrTable(@STR VARCHAR(8000),@CutChar VARCHAR(10))
RETURNS @STRINGTABLE TABLE (ITEM VARCHAR(8000),) --返回字符
AS
BEGIN
DECLARE @COUNT INT --出错处理
SET @COUNT=0
--SET @CutChar=REPLACE(@CutChar, ' ', ' ') --去除空格
DECLARE @CutLen INT --分割符长度
Set @CutLen=Len(@CutChar)
IF RIGHT(@STR,@CutLen) <> @CutChar SET @STR=@STR+@CutChar --规范化字符串
SET @STR=REPLACE(@STR,@CutChar+@CutChar,@CutChar) --规范化字符串
WHILE @STR <> ' ' AND @COUNT <=4000
BEGIN
INSERT @STRINGTABLE
SELECT SUBSTRING(@STR,1,CHARINDEX(@CutChar,@STR)-1)
SET @STR=SUBSTRING(@STR,CHARINDEX(@CutChar,@STR)+@CutLen,Len(@Str))
SET @COUNT=@COUNT+1
END
IF @COUNT=4000 DELETE FROM @STRINGTABLE --出错处理(防止死循环)
RETURN
END
GO
[解决办法]
按错键了,还没改就发了
[解决办法]
学习。。。
[解决办法]
Create FUNCTION FN_GETCUTSTRTABLE(@STR VARCHAR(8000),@CUTCHAR VARCHAR(10))
RETURNS @STRINGTABLE TABLE (ITEM VARCHAR(8000),BS CHAR(1)) --返回字符
AS
BEGIN
DECLARE @COUNT INT --出错处理
SET @COUNT=0
--SET @CUTCHAR=REPLACE(@CUTCHAR, ' ', ' ') --去除空格
SET @STR = REPLACE(@STR, ', ', ' ')
DECLARE @CUTLEN INT --分割符长度
SET @CUTLEN=LEN(@CUTCHAR)
DECLARE @SUBSTRING VARCHAR(8000)
SET @SUBSTRING = ' '
IF RIGHT(@STR,@CUTLEN) <> @CUTCHAR SET @STR=@STR+@CUTCHAR --规范化字符串
SET @STR=REPLACE(@STR,@CUTCHAR+@CUTCHAR,@CUTCHAR) --规范化字符串
WHILE @STR <> ' ' AND @COUNT <=4000
BEGIN
SELECT @SUBSTRING = SUBSTRING(@STR,1,CHARINDEX(@CUTCHAR,@STR)-1)
INSERT @STRINGTABLE(ITEM,BS)
VALUES(LEFT(@SUBSTRING,LEN(@SUBSTRING)-1),RIGHT(@SUBSTRING,1))
SET @STR=SUBSTRING(@STR,CHARINDEX(@CUTCHAR,@STR)+@CUTLEN,LEN(@STR))
SET @COUNT=@COUNT+1
END
IF @COUNT=4000 DELETE FROM @STRINGTABLE --出错处理(防止死循环)
RETURN
END
GO
select * from dbo.FN_GETCUTSTRTABLE( '14321A#14532B#,12344A#14756C ', '# ')
ITEM BS
------ ----
14321 A
14532 B
12344 A
14756 C