2017-06-08 11 views
1

SQL Serverに基づいてWordpressをインストールしていて、wp_postのpost_contentフィールドからイメージ名を抽出したいとします。私はpatindex、like節などでたくさん試してみましたが、どうやって行うのかわかりません。私は1つまたは複数の画像を含むことができ、約10 000テーブル内のレコードとPOST_CONTENTにおける含有量を有​​するSQL列からイメージ名を抽出する方法

<a href="http://www.example.com/wp-content/uploads/2017/06/1-1.jpg"><img class="aligncenter size-large wp-image-133975" src="http://www.example.com/wp-content/uploads/2017/06/1-1-1024x682.jpg" alt="" width="604" height="402" /></a> 

ここPOST_CONTENT列の行の内容の一例です。

/wp-content/uploads/2017/06/1-1.jpg

/WP-コンテンツ/アップロード/ 2017/06/1-1:私はこのようなイメージの名前を抽出したい -1024x682.jpg

ありがとうございました。

+5

最初の手順:テーブルにhtmlを格納しないように再設計します。 –

+0

テーブル内の各画像の相対パスが必要ですか?ドメイン名は一貫していますか、それとも変わることがありますか?すべての点で一貫性のあるものはありますか?パスの最初のフォルダは常に "wp-content"ですか?理由は、一貫したアンカーがあれば、コードがもっと簡単になるということです。 –

答えて

0

あなたはTVFを開いている場合。

文字列を抽出するのに疲れてしまったので、2つの非類似パラメータを受け入れるように解析関数を変更しました。

Declare @YourTable table (ID int,post_content varchar(max)) 
Insert Into @YourTable values 
(1,'<a href="http://www.example.com/wp-content/uploads/2017/06/1-1.jpg"><img class="aligncenter size-large wp-image-133975" src="http://www.example.com/wp-content/uploads/2017/06/1-1-1024x682.jpg" alt="" width="604" height="402" /></a>') 


Select A.ID 
     ,ImageSrc = B.RetVal 
From @YourTable A 
Cross Apply [dbo].[udf-Str-Extract](A.post_content,'.com','"') B 
Where right(B.RetVal,4) in ('.jpg','.png','.gif') 

戻り

ID ImageSrc 
1 /wp-content/uploads/2017/06/1-1.jpg 
1 /wp-content/uploads/2017/06/1-1-1024x682.jpg 

UDF興味

CREATE FUNCTION [dbo].[udf-Str-Extract] (@String varchar(max),@Delimiter1 varchar(100),@Delimiter2 varchar(100)) 
Returns Table 
As 
Return ( 

with cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)), 
     cte2(N) As (Select Top (IsNull(DataLength(@String),0)) Row_Number() over (Order By (Select NULL)) From (Select N=1 From cte1 N1,cte1 N2,cte1 N3,cte1 N4,cte1 N5,cte1 N6) A), 
     cte3(N) As (Select 1 Union All Select t.N+DataLength(@Delimiter1) From cte2 t Where Substring(@String,t.N,DataLength(@Delimiter1)) = @Delimiter1), 
     cte4(N,L) As (Select S.N,IsNull(NullIf(CharIndex(@Delimiter1,@String,s.N),0)-S.N,8000) From cte3 S) 

Select RetSeq = Row_Number() over (Order By N) 
     ,RetPos = N 
     ,RetVal = left(RetVal,charindex(@Delimiter2,RetVal)-1) 
From (
     Select *,RetVal = Substring(@String, N, L) 
     From cte4 
     ) A 
Where charindex(@Delimiter2,RetVal)>1 

) 
/* 
Max Length of String 1MM characters 

Declare @String varchar(max) = 'Dear [[FirstName]] [[LastName]], ...' 
Select * From [dbo].[udf-Str-Extract] (@String,'[[',']]') 
*/ 
+0

素晴らしい!ありがとう、それは本当にうまくいった。今私はどのポストでも使用されていない210 000の写真をサーバーから削除できます。 –

+0

@JohnFそれは助けてくれた。 –

0

はこれを試してみてください場合:

DECLARE @table TABLE (ID INT IDENTITY(1,1),data NVARCHAR(500)) 
INSERT @table VALUES('<a href="http://www.example.com/wp-content/uploads/2017/06/1-1.jpg"><img "D:/abc.jpg" class="aligncenter size-large wp-image-133975" src="http://www.example.com/wp-content/uploads/2017/06/1-1-1024x682.jpg" alt="" width="604" height="402" /></a>') 
DECLARE @images TABLE (ID INT,data NVARCHAR(500),passed INT) 
DECLARE @collecter INT = 1 

WHILE(@collecter=1) 
BEGIN 
INSERT INTO @images 
SELECT ID, SUBSTRING(REVERSE(data),CHARINDEX('gpj.',REVERSE(data))+4,500),0 FROM @table 
UPDATE @images SET data = REVERSE(SUBSTRING(data,1,CHARINDEX('/',data+'/')-1))+'.jpg' WHERE passed = 0 
UPDATE A SET A.data = SUBSTRING(A.data,1,CHARINDEX(B.data,A.data)-1) FROM @table A JOIN @images B ON A.ID = B.ID WHERE passed = 0 
UPDATE @images SET passed = 1 
IF EXISTS (SELECT 1 FROM @table GROUP BY data HAVING CHARINDEX('.jpg',data)>0) SET @collecter = 1 ELSE SET @collecter = 0 
END 

SELECT data FROM @images 
関連する問題