0

ユーザーがテキスト編集ボックスに入力した名前を格納するテーブルがあります。

この入力ボックスには選択もマスキングもありません

これにより、データベースに次のような一貫性のないデータが含まれます。

John Doe
 John Dow
Jonh doe
johh Doe

名前がJohn 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 の使用

4

4 に答える 4

1

さて、あなたは使うことができますcase

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')
于 2013-02-19T20:19:40.363 に答える
0

これは単純な LEFT OUTER JOIN です。すべてのスペルミスがテーブルにあり、スペルミス自体が一意であると仮定します。つまり、各スペルミスは 1 つの名前だけに関連付けられます。NVL を使用して最初に正しい名前を使用していることを確認してください

select nvl(b.name, a.name) as name
  from tablename a
  join misspellings b
    on a.name = b.misspelling

表を更新するかどうか確信が持てません (それがあなたが試みていることである場合は明確ではありません) スペルミスが実際に正しい場合はどうなりますか?

于 2013-02-19T20:20:19.833 に答える
0

これを試してみてください:

    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

変換テーブルへの外部結合を確認してください。とは言っても、入力に対していくつかの基本的なクリーンアップを試すこともできます。

于 2013-02-19T21:02:02.383 に答える
0

join、initcaps、CASE などは忘れてください。これらは通常、テキストの検索には使用されません。両側を上にして、Like 演算子を使用します。コピーして貼り付けて結果を表示します。

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
于 2013-02-20T15:05:38.017 に答える