如何格式化sql/oracle数据库中大量数据的用户输入名称?
我有一个表,它将用户输入的名称存储到文本编辑框中 此输入框上没有选择或屏蔽 这会导致数据库具有不一致的数据,例如如何格式化sql/oracle数据库中大量数据的用户输入名称?,sql,oracle,spell-checking,data-entry,Sql,Oracle,Spell Checking,Data Entry,我有一个表,它将用户输入的名称存储到文本编辑框中 此输入框上没有选择或屏蔽 这会导致数据库具有不一致的数据,例如 John Doe John Dow Jonh doe johh Doe 当名字应该是约翰·多伊的时候 我想知道如何创建一个查询来处理将名称解析回多个用户名应该是什么(我知道所有拼写错误的名称) 例如: select name from tableName set ( if(name = 'John Dow' or name = 'Johh Doe') name = 'John D
John Doe
John Dow
Jonh doe
johh Doe
当名字应该是约翰·多伊的时候
我想知道如何创建一个查询来处理将名称解析回多个用户名应该是什么(我知道所有拼写错误的名称)
例如:
select name from tableName
set
(
if(name = 'John Dow' or name = 'Johh Doe') name = 'John Doe'
)
(
if(name = 'Janee Doe' or name = 'Jaan Doe' name = 'Jane Doe'
)
使用SQL和Oracle Developer那么,您可以使用
案例
:
update tableName
set name = (case when name in ('John Dow', 'Johh Dow') then 'John Doe'
when name in ('Janee Doe', 'Jaan doe') then 'Jane Doe'
else name
end)
您可能希望包含一个where
子句来限制使用相同值更新的行数:
where name in ('John Dow', 'Johh Dow', 'Janee Doe', 'Jaan doe')
这是一个简单的左外连接;假设表中有所有拼写错误,并且拼写错误本身是唯一的,即每个拼写错误都与一个且仅一个名称关联。只需确保首先使用NVL使用正确的名称即可
select nvl(b.name, a.name) as name
from tablename a
join misspellings b
on a.name = b.misspelling
我不确定我是否会更新表格(如果这是您正在尝试的,则不清楚)如果拼写错误实际上是正确的,会发生什么情况?试一试:
with testdata as
(
select 'John Doe' as name from dual
union
select ' John dow' as name from dual
union
select ' JON DOH ' as name from dual
union
select ' Joe wtf ' as name from dual
),
transdata as (
select 'JOHN DOW' as badval, 'JOHN DOE' as goodval from dual
union
select 'JON DOH' as badval, 'JOHN DOE' as goodval from dual
)
select
'"' || td.name || '"' as raw_name,
--initcap(trim(regexp_replace(nvl(tr.goodval, td.name), '(\W){2,}', ' '))) as output
initcap(nvl(tr.goodval, trim(regexp_replace(td.name, '(\W){2,}', ' ')))) as output
from testdata td, transdata tr
where upper(trim(regexp_replace(td.name, '(\W){2,}', ' '))) = tr.badval(+);
RAW_NAME,OUTPUT
" John dow",John Doe
" JON DOH ",John Doe
"John Doe",John Doe
" Joe wtf ",Joe Wtf
确保将外部联接到翻译表。尽管如此,您也可以尝试对输入进行一些基本清理。忘记连接、initcaps、CASE等。。。这些通常不用于搜索文本。使两侧朝上,并使用类似的操作器。复制/粘贴以查看结果:
With t AS
(
SELECT 'John Doe' name FROM dual
UNION ALL
SELECT 'John Dow' FROM dual
UNION ALL
SELECT 'Jonh doe' FROM dual
UNION ALL
SELECT 'johh Doe' FROM dual
)
SELECT name FROM t WHERE Upper(name) Like Upper('%jo%do%') --or '%john%do%' - up to you
/
Output:
NAME
-------------
John Doe
John Dow
Jonh doe
johh Doe
我没有表中的拼写错误,我假设如果拼写错误是正确的,也就是说,它会通过我的“声明”部分,我会将它设置为自身还是其他?不确定为什么不@jordan;这样维护起来就容易多了。每当您遇到另一个示例时,只需将其插入表中即可。只要拼写错误是PK,当你有两次相同的PK时,你就会得到警告,如果你在代码中有这个,你就不会得到警告。