Sql 如何在Oracle中执行内部联接时转义字符串中的特殊字符?
有一个临时表格,上面有单词和id。我必须将这些单词与主表进行内部连接才能获得它们的id。但是临时表可能会有特殊字符以及数字之类的单词。数字/,数字/数字,/-数字/数字-。在这种情况下,内部联接不会返回值位。如何转义这些字符以确保返回值“digits” 我需要保留tmp表中的特殊字符。只需要在加入时逃离这些Sql 如何在Oracle中执行内部联接时转义字符串中的特殊字符?,sql,regex,oracle,inner-join,special-characters,Sql,Regex,Oracle,Inner Join,Special Characters,有一个临时表格,上面有单词和id。我必须将这些单词与主表进行内部连接才能获得它们的id。但是临时表可能会有特殊字符以及数字之类的单词。数字/,数字/数字,/-数字/数字-。在这种情况下,内部联接不会返回值位。如何转义这些字符以确保返回值“digits” 我需要保留tmp表中的特殊字符。只需要在加入时逃离这些 for t in (select id,word from tmp) LOOP update tmp a set a.word_id = ( select
for t in (select id,word from tmp)
LOOP
update tmp a
set a.word_id = (
select b.id
from main_table b
where lower(a.word) = lower(b.word)
and rownum =1
)
where a.word in (select word from tmp where word = t.word);
END LOOP;
预期结果是将word_id从主_表更新到tmp表
ID WORD WORD_ID
1 digits 111
2 digits. 111
3 .digits- 111
在进行比较之前,您可以尝试使用
REGEXP\u REPLACE
删除任何非字母数字字符:
UPDATE tmp a
SET a.word_id = (SELECT b.id
FROM main_table b
WHERE REGEXP_REPLACE(a.word, '[^A-Za-z0-9]', '') = b.word);
在进行比较之前,您可以尝试使用
REGEXP\u REPLACE
删除任何非字母数字字符:
UPDATE tmp a
SET a.word_id = (SELECT b.id
FROM main_table b
WHERE REGEXP_REPLACE(a.word, '[^A-Za-z0-9]', '') = b.word);
他是你的朋友
简单定义应该保留的字符-它们在TRANSLATE
字符串和应该删除的字符中定义相同,它们被映射为NULL
此查询中提供了此类信息的一个示例
select word,
translate(lower(word),'abcdefghijklmnopqrstuvwxyz.-#*+',
'abcdefghijklmnopqrstuvwxyz') word_clean
from tmp;
WORD WORD_CLEAN
---------- ----------
digits digits
digits. digits
.digits- digits
连接将看起来像这样
select tmp.word tmp_word, main_table.word main_word
from tmp
left outer join main_table
on translate(lower(tmp.word),'abcdefghijklmnopqrstuvwxyz.-#*+',
'abcdefghijklmnopqrstuvwxyz') = main_table.word
请注意,我正在使用lower
来消除大写字母-如果需要,请进行调整
另外请注意,TRANSLATE
选项将产生比REGEXP
选项更好的性能
简单定义应该保留的字符-它们在TRANSLATE
字符串和应该删除的字符中定义相同,它们被映射为NULL
此查询中提供了此类信息的一个示例
select word,
translate(lower(word),'abcdefghijklmnopqrstuvwxyz.-#*+',
'abcdefghijklmnopqrstuvwxyz') word_clean
from tmp;
WORD WORD_CLEAN
---------- ----------
digits digits
digits. digits
.digits- digits
连接将看起来像这样
select tmp.word tmp_word, main_table.word main_word
from tmp
left outer join main_table
on translate(lower(tmp.word),'abcdefghijklmnopqrstuvwxyz.-#*+',
'abcdefghijklmnopqrstuvwxyz') = main_table.word
请注意,我正在使用lower
来消除大写字母-如果需要,请进行调整
另外请注意,
TRANSLATE
选项将产生比带有REGEXP
的选项更好的性能,REGEXP\u replace()中的一个选项将使用[^[:alnum:]
POSIX
模式
函数,其中语句中的子选择条件为UPDATE
:
regexp\u replace(t.word,[^[:alnum:][])=m.word
其中,t
是表tmp
的别名,m
是表main\u
的别名,UPDATE
语句中的子选择的[^[:alnum:]
条件中的regexp\u replace()
函数中的模式将使用一个选项:
regexp\u replace(t.word,[^[:alnum:][])=m.word
其中t
是表tmp
的别名,m
是表的别名,下面是另一种方法
update tmp a
set a.word_id = (
select b.id
from main_table b
where lower(a.word) like concat(concat('%',b.word),'%')
and rownum =1
下面是另一种方法
update tmp a
set a.word_id = (
select b.id
from main_table b
where lower(a.word) like concat(concat('%',b.word),'%')
and rownum =1
谢谢你,蒂姆。这起作用了。该表现在用其word ID更新。我现在正在尝试将子字符串“digit”替换为“digits”。如www.xxx.com/digits/123digits。我希望“.”不会成为这次替换的一部分。我正在寻找你的帮助,以摆脱特殊字符,同时取代。太好了。打开一个新问题,我相信有人会帮助你!谢谢你,蒂姆。这起作用了。该表现在用其word ID更新。我现在正在尝试将子字符串“digit”替换为“digits”。如www.xxx.com/digits/123digits。我希望“.”不会成为这次替换的一部分。我正在寻找你的帮助,以摆脱特殊字符,同时取代。太好了。打开一个新问题,我相信有人会帮助你!