Sql 如何在Oracle中执行内部联接时转义字符串中的特殊字符?

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

有一个临时表格,上面有单词和id。我必须将这些单词与主表进行内部连接才能获得它们的id。但是临时表可能会有特殊字符以及数字之类的单词。数字/,数字/数字,/-数字/数字-。在这种情况下,内部联接不会返回值位。如何转义这些字符以确保返回值“digits”

我需要保留tmp表中的特殊字符。只需要在加入时逃离这些

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。我希望“.”不会成为这次替换的一部分。我正在寻找你的帮助,以摆脱特殊字符,同时取代。太好了。打开一个新问题,我相信有人会帮助你!