Teradata从变量中删除封闭的单引号

时间:2017-05-16 14:11:36

标签: teradata quotes

我需要替换一串数字中的单引号并在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'.

请建议如何删除单个封闭引号,甚至删除所有单引号也应该有效。

1 个答案:

答案 0 :(得分:1)

您使用的字符串''4532','3422','1289''不正确,因为它包含非转义单引号。这是SQL中的语法错误。在这种特定的形式中,无论您使用什么功能来修复它或使用哪种RDBMS,都会导致标准SQL出错。

SQL中的函数无法修复语法错误。 REGEXP_REPLACEOReplace永远不会被执行,因为查询永远不会进入执行状态。它永远不会超过SQL语法分析器。

要从SQL解析器的角度看错误,您可以将字符串分解为多个部分

  1. '' - SQL Parser将此视为起始和结束引用,因此为空字符串
  2. 4532 - 现在看来SQL解析器看起来是一个整数值
  3. ',' - 现在这是一对包含单个逗号的引号
  4. 3422 - 又是一个整数
  5. ',' - 再次使用逗号
  6. 1289 - 再次整数
  7. '' - 再次发送字符串
  8. 这种字符串和数字的混合对SQL解析器没有任何意义,并且会导致错误。

    修复

    修复是正确转义数据。单引号必须使用另一个前面的单引号进行转义。因此,此方案中的正确字符串变为'''4532'',''3422'',''1289'''

    另一件事是OReplace用法(一旦语法修复)就像OReplace(yourStringValueHere, '''', ' '))在这里观察转义单引号的用法。两个外部引号用于字符串的开头和结尾。第一个内部引用是转义字符,第二个内部引用是传递给函数的实际数据。