查询以查找和替换SQL数据库中的特定单词,而不会影响数据

时间:2013-02-12 14:18:57

标签: sql sql-server sql-server-2008

我有一个数据库,其中包含一个表格,其中包含有关第一产业和第二产业所属行业信息的条目:

例如:航空航天和国防,零售,批发和分销          研究与开发,技术,媒体和电信 等。

大约有500个这样的条目。我希望分离符号','仅在第一产业和第二产业之间,而在行业名称中没有。

代表。 :                  航空航天与国防,零售,批发与分销

应该看起来像

航空航天与国防,零售批发与分销(不含逗号)

无论如何都可以实现这一点,即在不影响主要术语的情况下替换次要术语中的逗号。

3 个答案:

答案 0 :(得分:2)

首先,你有错误的表格设计。单个列永远不应列出由逗号分隔的一堆值。这是一个应对的噩梦(正如你所发现的那样)。

相反,应该有一个单独的表将人与行业联系起来,允许每人多行:

person_id          industry
1                  Retail, Wholesale and Distribution
1                  Aerospace and Defense
2                  Retail, Wholesale and Distribution

然后,只要您需要为一个人或一群人找到行业,就可以加入此表。

显然,这会让你的逗号问题消失。

当然,有时你会遇到一个愚蠢的桌子设计。如果是这样,您可以使用replace()找到替代解决方案(感谢提及替换功能的其他答案)。

<强>更新

Here is a working SQLFiddle solution

已更新以使用replace()

update bad_design 
   set bad_design.industries = 
       replace(bad_design.industries, from_str, to_str)
    from (
      select * from bad_design join replacements 
         on replace(bad_design.industries, from_str, to_str) <> '' 
    ) as a
    where a.person_id = bad_design.person_id;

注意:这不会在一次传递中对同一个字符串执行多次替换。你需要做更多的事情,比如递归查询。

答案 1 :(得分:0)

你可以在桌子上运行替换......

select replace(column_name,'Retail, Wholesale','Retail Wholesale')
from table

或更新

update table
set column_name = replace(column_name,'Retail, Wholesale','Retail Wholesale')

这基本上将字符串'Retail,Wholesale'替换为给定列中的'Retail Wholesale'。

答案 2 :(得分:0)

您需要使用SUBSTRING(),INSTRING()函数来查找字符串中的第一个逗号,并使用REPLACE()第二个逗号来判断您的示例。问你的问题:假设你总是需要替换字符串中的第二个逗号是否安全?您的所有字符串是否与您的示例相同或类似?等等... 此示例假定以上所有内容。另外,据我所知,用你的SQL版本替换双表和任何其他表和Oracle语法 - 在SQL Server中SUBSTR()= SUBSTRING。这同样适用于INSTR()......:

SELECT str -- orig str --
     , SUBSTR(str, 1, INSTR(str, ',', 1, 1)) first_string
     , REPLACE(SUBSTR(str,  INSTR(str, ',', 1, 1)+1), ',', '') second_string
  FROM
   (
    SELECT 'Aerospace and Defense,Retail, Wholesale and Distribution' str 
      FROM dual
    )
  /

输出(已测试) - 您需要使用SQL server sytax连接first_string和second_string。在Oracle中,它将是SELECT first_string ||''|| second_string FROM ...:

  Aerospace and Defense, Retail Wholesale and Distribution

在SQL SERVER中创建DUAL表:http://blog.sqlauthority.com/2010/07/20/sql-server-select-from-dual-dual-equivalent/