我有一个带有表格的数据库,其中包含有关人们所属行业的信息的条目,包括第一产业和第二产业:
例如:航空航天和国防、零售、批发和分销研发、技术、媒体和电信等。
大约有 500 个这样的条目。我想要分隔符号','只在第一产业和第二产业之间,并且在行业名称中没有。
例如。: 航空航天和国防、零售、批发和分销
应该看起来像
航空航天和国防、零售批发和分销(不带逗号)
无论如何这可以实现,即在不影响主要术语的情况下从次要术语中替换逗号。
我有一个带有表格的数据库,其中包含有关人们所属行业的信息的条目,包括第一产业和第二产业:
例如:航空航天和国防、零售、批发和分销研发、技术、媒体和电信等。
大约有 500 个这样的条目。我想要分隔符号','只在第一产业和第二产业之间,并且在行业名称中没有。
例如。: 航空航天和国防、零售、批发和分销
应该看起来像
航空航天和国防、零售批发和分销(不带逗号)
无论如何这可以实现,即在不影响主要术语的情况下从次要术语中替换逗号。
首先,你有错误的表设计。单列永远不应该列出一堆用逗号分隔的值。这是一场噩梦(正如您所发现的那样)。
相反,应该有一个单独的表格将人们与行业联系起来,允许每人多行:
person_id industry
1 Retail, Wholesale and Distribution
1 Aerospace and Defense
2 Retail, Wholesale and Distribution
然后在您需要为一个人或一群人查找行业时加入此表。
显然,这使您的逗号问题消失了。
当然,有时您会被愚蠢的桌子设计所困扰。如果是这样,您可以使用replace()
(感谢其他提到替换功能的答案)提出替代解决方案。
更新:
更新使用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;
注意:这不会一次对同一字符串执行多次替换。你需要更多的东西来做到这一点,比如递归查询。
根据您的示例,您需要使用 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/
您可以在桌子上运行替换...
select replace(column_name,'Retail, Wholesale','Retail Wholesale')
from table
或更新
update table
set column_name = replace(column_name,'Retail, Wholesale','Retail Wholesale')
这基本上将给定列中的字符串“零售,批发”替换为“零售批发”。