2017-05-08 51 views
-2

我有一个表中,如下所示我的数据库进行数据库更新列:
如何根据类似的数据

id  name  url 
1  France NULL 
2  USA  NULL 
... 

url是关于我的云服务器的资源链接。这仅仅是这样的:

http://myserver.com/France/something 
http://myserver.com/USA/something 

我已经创建表了很长时间。现在,我的同事刚刚完成将所有资源上传到云服务器,所以我刚刚收到了所有的URL。

我需要做的是更新列url

我的同事给了我如下csv文件:

http://myserver.com/France/something,http://myserver.com/USA/something 

有一些简单的方法(如某些SQL脚本)来更新我的表?我确信每个网址都包含name列的值。例如,http://myserver.com/USA/something包含值USA,即select name from mytable where id = 2

+0

你真的需要正则表达式吗?如果数据样本是上面显示的数据,那么您可以在更新状态中使用类似子句statemet –

+0

@ e.arbitrio嗯,我不知道该怎么做... – Yves

+0

你能解释什么是csv准确的文件?它是一个一行csv? – tafia

回答

0

我试着像你这样的样本数据,该代码工作

CREATE TEMPORARY TABLE temp_table (url VARCHAR(45)); 
LOAD DATA LOCAL INFILE 'urls.csv' INTO TABLE temp_table FIELDS TERMINATED BY ';' IGNORE 1 LINES (url); 
UPDATE cities JOIN temp_table on temp_table.url LIKE CONCAT('%', cities.name ,'%') SET cities.url = temp_table.url;cities 
DROP TEMPORARY TABLE temp_table; 

好运

+0

它似乎没有工作... – Yves

+0

我刚刚编辑我的答案分组所有的代码。我现在使用示例数据播放sql,它完美地工作。让我知道 –

+0

哦,我知道。你的代码运行良好。但有时我有一些特殊情况。如我试图匹配'abc%20def'和'abc def'。 – Yves

0

首先拆分网址,然后使用like更新网址。

功能分割值:

  create FUNCTION [dbo].[SplitValues] (@StringArray NVARCHAR(MAX), @Delimiter NVARCHAR(10)) 
      RETURNS @ResultedValues table (ResultValue nvarchar(max)) 
      AS 
      BEGIN 
       declare @string nvarchar(max) 
       set @string = @StringArray 
       WHILE (CHARINDEX(@Delimiter,@String)>0) 
       BEGIN 
       INSERT INTO @ResultedValues (ResultValue) VALUES (LTRIM(RTRIM(SUBSTRING(@String,1,CHARINDEX(@Delimiter,@String)-1)))) 
       SET @String = SUBSTRING(@String, CHARINDEX(@Delimiter,@String)+LEN(@Delimiter),LEN(@String)) 
       END 
      INSERT INTO @ResultedValues (ResultValue) VALUES (LTRIM(RTRIM(@String))) 
      RETURN 
      END 

更新语句:

  update t 
      set url = fn.ResultValue 
      from mytable t 
      join [dbo].[SplitValues] ('http://myserver.com/France/something,http://myserver.com/USA/something') ,',') fn 
       on fn.url like '%'+t.name+'%'