有一表字段为 A,字段A的内容如下:
A
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5我只想取出数字2所在的位置的数据 请高手指点 谢谢!!
A
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5我只想取出数字2所在的位置的数据 请高手指点 谢谢!!
|2|的位置?
select charindex('|2|','|'+A+'|')
from ta
--======= 每天都在进步,却依然追不上地球的自传=========
--======= By: zc_0101 At:2010-07-23 16:04:36=========
--========++++++++++++++++++++++++++++++++++++=========
--> 测试数据: #A
if object_id('tempdb.dbo.#A') is not null drop table #A
create table #A (ID INT IDENTITY(1,1),COL VARCHAR(100))
insert into #A
select '1|2|3|4|5' union all
select '1|2|3|4|5' union all
select '1|2|3|4|5' union all
select '1|2|3|4|5' union all
select '1|2|3|4|5' union all
select '1|2|3|4|5'select * from #A--创建自定义函数
--SQL Server Split函数
--Author:zc_0101
--说明:
--支持分割符多字节
--使用方法
--Select * FROM DBO.F_SQLSERVER_SPLIT('1203401230105045','0')
--select * from DBO.F_SQLSERVER_SPLIT('abc1234a12348991234','1234')
CREATE FUNCTION F_SQLSERVER_SPLIT(@Long_str varchar(8000),@split_str varchar(100))
RETURNS @tmp TABLE(
ID inT IDENTITY PRIMARY KEY,
short_str varchar(8000)
)
AS
BEGIN
DECLARE @long_str_Tmp varchar(8000),@short_str varchar(8000),@split_str_length int
SET @split_str_length = LEN(@split_str)
IF CHARINDEX(@split_str,@Long_str)=1
SET @long_str_Tmp=SUBSTRING(@Long_str,@split_str_length+1,LEN(@Long_str)-@split_str_length)
ELSE
SET @long_str_Tmp=@Long_str
IF CHARINDEX(REVERSE(@split_str),REVERSE(@long_str_Tmp))>1
SET @long_str_Tmp=@long_str_Tmp+@split_str
ELSE
SET @long_str_Tmp=@long_str_Tmp
IF CHARINDEX(@split_str,@long_str_Tmp)=0
Insert INTO @tmp select @long_str_Tmp
ELSE
BEGIN
WHILE CHARINDEX(@split_str,@long_str_Tmp)>0
BEGIN
SET @short_str=SUBSTRING(@long_str_Tmp,1,CHARINDEX(@split_str,@long_str_Tmp)-1)
DECLARE @long_str_Tmp_LEN INT,@split_str_Position_END int
SET @long_str_Tmp_LEN = LEN(@long_str_Tmp)
SET @split_str_Position_END = LEN(@short_str)+@split_str_length
SET @long_str_Tmp=REVERSE(SUBSTRING(REVERSE(@long_str_Tmp),1,@long_str_Tmp_LEN-@split_str_Position_END))
IF @short_str<>'' Insert INTO @tmp select @short_str
END
END
RETURN
END ----------------查询------------
SELECT a.ID,b.SHORT_STR col FROM #A a
cross apply DBO.F_SQLSERVER_SPLIT(a.COL,'|')b WHERE b.ID=2
----------------结果--------------
/*
ID col
1 2
2 2
3 2
4 2
5 2
6 2
*/
set @str='1|2|3|4|5'
--select Charindex('|',@str,0)
select Substring(@str,2,1)看看是不是你想要的
那就 Substring 里面把参数换一下就可以了啊 ,用charindex 取到位置和长度
if object_id('tempdb.dbo.#A') is not null drop table #A
create table #A (ID INT IDENTITY(1,1),COL VARCHAR(100))
insert into #A
select '1|2|3|4|5' union all
select '1|2|3|4|5' union all
select '1|2|3|4|5' union all
select '1|2|3|4|5' union all
select '1|2|3|4|5' union all
select '1|2|3|4|5' union all
select '1|2222|33|4|5'
select substring(substring(col,charindex('|',col,1)+1,len(col)),1,charindex('|',substring(col,charindex('|',col,1)+1,len(col)),1)-1) from #A结果
无列名
2
2
2
2
2
2
2222
drop function [dbo].[f_GetStr]
GO--煦僇諍滲杅
CREATE FUNCTION dbo.f_GetStr(
@s varchar(8000), --字符
@pos int, --位置
@split varchar(10) --分割符
)RETURNS varchar(100)
AS
BEGIN
IF @s IS NULL RETURN(NULL)
DECLARE @splitlen int
SELECT @splitlen=LEN(@split+'a')-2
WHILE @pos>1 AND CHARINDEX(@split,@s+@split)>0
SELECT @pos=@pos-1,
@s=STUFF(@s,1,CHARINDEX(@split,@s+@split)+@splitlen,'')
RETURN(ISNULL(LEFT(@s,CHARINDEX(@split,@s+@split)-1),''))
END
GO
declare @a varchar(8000),@b varchar(8000),@d int; set @a=
'1|2|3|4|5
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5';set @d=len(@a);
set @b='';
select subString(@a,58,1);
while @d>-1
begin
if subString(@a,@d,1)='2'
begin
set @b=@b+subString(@a,@d,1)+' ';
end
set @d=@d-1;
end
select @b;