我在SQL中有一个字符串,如
CMS / 00014456582 / 693362 / 004535 / JCR_110914_NEW_4535 CMS
我想以粗体显示一个字符串。
如何使用substring函数读取该字符串。
select SUBSTRING('CMS/00014456582/693362/004535/JCR_110914_NEW_4535 CMS',18,6) AS column_name
这是我的问题的一个答案。但是我希望在两个' /'之后阅读字符串。 - 文件分隔符。
我有另一个字符串,如 INF / 000079160100 / P - (34)案例净银行,我想读取(此)值.eg 34 提前谢谢。
答案 0 :(得分:2)
DECLARE @Text NVARCHAR(1000)
select @Text = SUBSTRING('CMS/00014456582/693362/004535/JCR_110914_NEW_4535 CMS', CHARINDEX('/', 'CMS/00014456582/693362/004535/JCR_110914_NEW_4535 CMS') + 1,1000)
SELECT SUBSTRING(@Text, CHARINDEX('/', @Text) + 1,6) AS column_name
答案 1 :(得分:2)
获得所需内容的一种非常灵活的方法是使用recursive CTE
。 CTE表达式基本上会给你所有' /'的位置和相应的索引。包含在字符串中:
DECLARE @string VARCHAR(MAX) = 'CMS/00014456582/693362/004535/JCR_110914_NEW_4535 CMS'
;WITH CTE AS (
SELECT CHARINDEX('/', @string) AS pos, idx = 1
UNION ALL
SELECT CHARINDEX('/', @string, pos+1) AS pos, idx + 1
FROM CTE
WHERE pos > 0
)
SELECT *
FROM CTE
产生
pos idx
-------
4 1
16 2
23 3
30 4
0 5
使用上面的CTE,您可以轻松提取第一和第二斜杠,第二和第三等中包含的字符串的 任何部分 :
;WITH CTE AS (
SELECT CHARINDEX('/', @string) AS pos, idx = 1
UNION ALL
SELECT CHARINDEX('/', @string, pos+1) AS pos, idx + 1
FROM CTE
WHERE pos > 0
)
SELECT SUBSTRING(@string,
(SELECT pos FROM CTE WHERE idx = 2) + 1,
(SELECT pos FROM CTE WHERE idx = 3) - (SELECT pos FROM CTE WHERE idx = 2) - 1)
答案 2 :(得分:1)
如果必须选择的字符串具有固定长度并且在第二次出现'/'后将会这样做
DECLARE @document varchar(64);
SELECT @document = 'CMS/00014456582/693362/004535/JCR_110914_NEW_4535 CMS'
select Substring(@document, CHARINDEX('/', @document,(SELECT CHARINDEX('/', @document)+1))+1,6)
答案 3 :(得分:1)
我写了一个函数来分割我的字符串数据。这对你也有好处:
CREATE FUNCTION [dbo].[SPLIT]
(
@ROWDATA NVARCHAR(2000),
@SPLITON NVARCHAR(5)
)
RETURNS @RTNVALUE TABLE
(
ID INT IDENTITY(1,1),
DATA NVARCHAR(100)
)
AS
BEGIN
DECLARE @CNT INT
SET @CNT = LEN(@SPLITON)
WHILE (CHARINDEX(@SPLITON,@ROWDATA)>0)
BEGIN
INSERT INTO @RTNVALUE (DATA)
SELECT
DATA = LTRIM(RTRIM(SUBSTRING(@ROWDATA,1,CHARINDEX(@SPLITON,@ROWDATA)-1)))
SET @ROWDATA = SUBSTRING(@ROWDATA,CHARINDEX(@SPLITON,@ROWDATA)+1,LEN(@ROWDATA))
SET @CNT = @CNT + @CNT
END
INSERT INTO @RTNVALUE (DATA)
SELECT DATA = LTRIM(RTRIM(@ROWDATA))
RETURN
END
创建此功能然后
SELECT DATA FROM SPLIT ('CMS/00014456582/693362/004535/JCR_110914_NEW_4535 CMS','/');
这将返回一个表格,其中每一行都是字符串的“/”分隔数据。
答案 4 :(得分:1)
感谢您的提问 如果粗体区域长度不是6位
,请尝试以下方法帮助您 DECLARE @document varchar(64);
DECLARE @start int;
DECLARE @lenght int;
SELECT @document = 'CMS/00014456582/693362/004535/JCR_110914_NEW_4535 CMS'
select @start = CHARINDEX('/',@document,CHARINDEX('/',@document)+1)+1
select @lenght = CHARINDEX('/',@document,CHARINDEX('/',@document,CHARINDEX('/',@document)+1)+1) - @start
select Substring(@document,@start, @lenght)