假设我有一张这样的表:
--------------------------------------------------
| id | text |
--------------------------------------------------
| 01 | Test string <div src="0124"> |
--------------------------------------------------
| 02 | Another type <div src="667"> test string |
--------------------------------------------------
我需要编写一个SELECT,它获取src =&#34;&#34;中的值。来自文本列中的字符串。所以我的最终结果应该是:
------
|text|
------
|0124|
-----
| 667|
在我的情况下SUBSTRING不适合我,因为我不知道我的子弦
此外,由于我正在寻找一个特定子字符串之后的值,我无法使用字符位置。
那么如何获取字符串中特定子字符串之后的值
答案 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)
您可以尝试此查询。它使用Substring
和charindex
来计算模式的起点和终点,并获取它们之间的所有内容。
--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
)语句。这个答案旨在表明一种表达字符串逻辑的方法。