TRIM BOTH Teradata不适用于单引号

时间:2017-05-16 15:51:31

标签: teradata trim

SELECT TRIM(BOTH 'a' FROM 'aaaaaaaaaaaaasdfasa');

工作正常并返回sdfas 但我试图删除引号,所以我做了

 SELECT TRIM(BOTH ''' FROM (''2565','5216','5364'') ;

我收到错误 - 查询在字符串或注释块中结束。请建议如何做到这一点

1 个答案:

答案 0 :(得分:0)

此答案假设.NET应用程序成功插入数据,问题发生在SELECTUPDATE时,即问题不在.NET应用程序中使用的准备好的SQL语句中。这也假定在WHERE .. IN中使用此类逻辑的数据健全性检查已经到位。

假设您的数据值为:

2565,5216,5364
'2565','5216','5364'

您的申请会将这些内容转换为以下内容:

'2565,5216,5364'
''2565','5216','5364''

为了便于本答案的查询设计,我们可以通过使用额外的单引号转义值中的每个单引号,然后将整个内容放在一对单引号中来转换为SQL的字符串值。一串;这给了我们:

'''2565,5216,5364'''
'''''2565'',''5216'',''5364'''''

如果要删除这些中的所有单引号,可以使用

SELECT OREPLACE( '''2565,5216,5364''', '''', '');
SELECT OREPLACE( '''''2565'',''5216'',''5364''''', '''', '');

这意味着用空字符串替换所有单引号并给出:

2565,5216,5364
2565,5216,5364

如果您要与整数值进行比较,可能会采用这种方法。

现在,如果您希望保留数据并仅删除.NET应用程序放置的封闭引号(例如,如果比较也是字符数据),那么您可以将其与其他逻辑相结合。让我们使用第二个数据值,因为它为这样的操作提供了更多的值

SELECT TRIM(BOTH '''' FROM '''''2565'',''5216'',''5364''''');

上面的查询将为您提供以下结果,该结果将从应用程序中删除封闭的引号,但也会删除用户输入的第一个和最后一个引号

2565','5216','5364

更好的选择,但假设您的应用程序始终将数据用引号括起来

SELECT SUBSTR('''''2565'',''5216'',''5364''''',2,CHARACTER_LENGTH('''''2565'',''5216'',''5364''''')-2);

这将从字符串中的第二个字符执行子字符串操作直到length-2,因此将忽略应用程序插入的两个引号

'2565','5216','5364'