在特定子字符串

时间:2016-04-25 10:22:50

标签: sql sql-server tsql

假设我有一张这样的表:

--------------------------------------------------
| id | text                                      |
--------------------------------------------------
| 01 | Test string <div src="0124">              |
--------------------------------------------------
| 02 | Another type <div src="667"> test string  |
--------------------------------------------------

我需要编写一个SELECT,它获取src =&#34;&#34;中的值。来自文本列中的字符串。所以我的最终结果应该是:

------
|text|
------
|0124|
-----
| 667|

在我的情况下SUBSTRING不适合我,因为我不知道我的子弦

此外,由于我正在寻找一个特定子字符串之后的值,我无法使用字符位置。

那么如何获取字符串中特定子字符串之后的值

5 个答案:

答案 0 :(得分:4)

您可以通过查找数字的初始位置然后查找字符串的长度来使用SUBSTRING:

$arr->Providers[0]->ID;

这将得到你的起始位置(注意我加5):

SELECT SUBSTRING(text, (CHARINDEX('src=', text) + 5), (CHARINDEX(CHAR(34) + '>', text) - (CHARINDEX('src=', text) + 5))) AS text
FROM yourTable;

以下将获得您的长度:

(CHARINDEX('src=', text) + 5)

答案 1 :(得分:1)

创建函数以获取数字

CREATE FUNCTION dbo.udf_GetNumeric
(@strAlphaNumeric VARCHAR(256))
RETURNS VARCHAR(256)
AS
BEGIN
DECLARE @intAlpha INT
SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric)
BEGIN
WHILE @intAlpha > 0
BEGIN
SET @strAlphaNumeric = STUFF(@strAlphaNumeric, @intAlpha, 1, '' )
SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric )
END
END
RETURN ISNULL(@strAlphaNumeric,0)
END
GO

称之为

/* Run the UDF with different test values */
SELECT dbo.udf_GetNumeric('') AS 'EmptyString';
SELECT dbo.udf_GetNumeric('asdf1234a1s2d3f4@@@') AS 'asdf1234a1s2d3f4@@@';
SELECT dbo.udf_GetNumeric('123456') AS '123456';
SELECT dbo.udf_GetNumeric('asdf') AS 'asdf';
SELECT dbo.udf_GetNumeric(NULL) AS 'NULL';

--In your case 

SELECT id, dbo.udf_GetNumeric([text]) from table
GO

答案 2 :(得分:0)

您可以尝试使用SQL string function CHARINDEX

中使用SQL CTE expression的脚本
-- create table tblHTML (id varchar(10), [text] nvarchar(max))
-- insert into tblHTML select '01',N'Test string <div src="0124">              '
-- insert into tblHTML select '02',N'Another type <div src="667"> test string  '
;with cte as (
    select
        *, 
        CHARINDEX('src="',[text],1)+len('src="') start,
        CHARINDEX('"',[text], CHARINDEX('src="',[text],1)+len('src="')) finish
    from tblHTML
)
select
    *, SUBSTRING([text], start, finish-start) src
from cte

答案 3 :(得分:0)

您可以尝试此查询。它使用Substringcharindex来计算模式的起点和终点,并获取它们之间的所有内容。

--create table #temp (id int, text nvarchar(max))
--insert into #temp
--values
--(1, 'Test string <div src="0124">'),
--(2, 'Another type <div src="667"> test string')
declare @pattern nvarchar(max), @patternend nvarchar(max)
set @pattern='<div src="'
set @patternend='"'
select 
id,
substring(text,charindex(@pattern,text)+len(@pattern), charindex(@patternend,text,charindex(@pattern,text)+len(@pattern))-charindex(@pattern,text)-len(@pattern))
as text from #temp

答案 4 :(得分:0)

SQL Server并不擅长字符串操作,特别是在提取值时。嵌套字符串函数可以产生混乱的代码。解决此问题的一种方法是使用outer apply

select t2.val
from t outer apply
     (select stuff(t.text, 1, charindex('src="', t.text) + 4, '') as text1
     ) t1 outer apply
     (select left(t1.text1, charindex('"', text1) - 1) as val) t2;

注意:如果在所有文本字段中都没有出现该值,则需要更复杂的逻辑(case)语句。这个答案旨在表明一种表达字符串逻辑的方法。