我需要替换一串数字中的单引号并在WHERE IN子句中使用。例如,我有
WHERE Group_ID IN (''4532','3422','1289'')
括号内的条件作为参数传递,因此我无法控制它。我尝试使用:
WHERE Group_ID IN (REGEXP_REPLACE(''4532','3422','1289'', '[']', ' ',1,0,i))
也尝试使用OReplace
WHERE Group_ID IN (OReplace(''4532','3422','1289'', '[']', ' '))
但得到同样的错误:
[Teradata Database] [3707] Syntax error, expected something like ','
between a string or a Unicode character literal and the integer '4532'.
请建议如何删除单个封闭引号,甚至删除所有单引号也应该有效。
答案 0 :(得分:1)
您使用的字符串''4532','3422','1289''
不正确,因为它包含非转义单引号。这是SQL中的语法错误。在这种特定的形式中,无论您使用什么功能来修复它或使用哪种RDBMS,都会导致标准SQL出错。
SQL中的函数无法修复语法错误。 REGEXP_REPLACE
和OReplace
永远不会被执行,因为查询永远不会进入执行状态。它永远不会超过SQL语法分析器。
要从SQL解析器的角度看错误,您可以将字符串分解为多个部分
''
- SQL Parser将此视为起始和结束引用,因此为空字符串4532
- 现在看来SQL解析器看起来是一个整数值','
- 现在这是一对包含单个逗号的引号3422
- 又是一个整数','
- 再次使用逗号1289
- 再次整数''
- 再次发送字符串这种字符串和数字的混合对SQL解析器没有任何意义,并且会导致错误。
修复是正确转义数据。单引号必须使用另一个前面的单引号进行转义。因此,此方案中的正确字符串变为'''4532'',''3422'',''1289'''
另一件事是OReplace
用法(一旦语法修复)就像OReplace(yourStringValueHere, '''', ' '))
在这里观察转义单引号的用法。两个外部引号用于字符串的开头和结尾。第一个内部引用是转义字符,第二个内部引用是传递给函数的实际数据。