-1

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

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

大约有 500 个这样的条目。我想要分隔符号','只在第一​​产业和第二产业之间,并且在行业名称中没有。

例如。: 航空航天和国防、零售、批发和分销

应该看起来像

航空航天和国防、零售批发和分销(不带逗号)

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

4

3 回答 3

2

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

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

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

然后在您需要为一个人或一群人查找行业时加入此表。

显然,这使您的逗号问题消失了。

当然,有时您会被愚蠢的桌子设计所困扰。如果是这样,您可以使用replace()(感谢其他提到替换功能的答案)提出替代解决方案。

更新:

这是一个有效的 SQLFiddle 解决方案

更新使用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;

注意:这不会一次对同一字符串执行多次替换。你需要更多的东西来做到这一点,比如递归查询。

于 2013-02-12T14:31:24.257 回答
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 服务器语法连接 first_string 和 second_string。在 Oracle 中,它将是 SELECT first_string ||''|| second_string 来自...:

  Aerospace and Defense, Retail Wholesale and Distribution

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

于 2013-02-12T14:48:24.013 回答
0

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

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

或更新

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

这基本上将给定列中的字符串“零售,批发”替换为“零售批发”。

于 2013-02-12T14:39:38.657 回答