我有一个数据库,其中包含一个表格,其中包含有关第一产业和第二产业所属行业信息的条目:
例如:航空航天和国防,零售,批发和分销 研究与开发,技术,媒体和电信 等。
大约有500个这样的条目。我希望分离符号','仅在第一产业和第二产业之间,而在行业名称中没有。
代表。 : 航空航天与国防,零售,批发与分销
应该看起来像
航空航天与国防,零售批发与分销(不含逗号)
无论如何都可以实现这一点,即在不影响主要术语的情况下替换次要术语中的逗号。
答案 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/