SQL字符串比较 - 忽略空格的方式

时间:2015-11-17 14:50:13

标签: sql oracle

我准备了一个SQL查询,我必须在几个数据库(Oracle和Sybase)上运行,其中一些数据可能以不同方式存储。

我注意到数据存储的一个区别是空字符串。 例如,在下面的PRODUCT_TYPE列中,请查看第二条记录:

enter image description here

这个"空字符串" (数据类型为CHAR(15))在某些数据库中以红色圈出等于'',而对于其他数据库则等于' '。长度永远不会是常数,并且有几个字段表现如此。

因此,由于我需要对这些"空字符串"进行过滤,我应该在WHERE子句中更改以下语句:

WHERE PRODUCT_TYPE = ''

...因为上述内容会使' '字符串与''不同,即使"功能正常"说话不是。 因此,我想以这样的方式发表声明,即它忽略空格",即' '等于'',等于' '等。 我应该如何进行此更改才能使其正常工作?

我尝试过简单的替换方法:

WHERE REPLACE(PRODUCT_TYPE,' ','') = ''

......但它似乎没有用,可能是因为我应该使用不同的角色。 为了测试,在下面的'里面有一个复制粘贴的例子,我在这些"空字符串中找到了什么":

'               '

理想情况下,它应该是一个非特定的SQL"因为我必须在Oracle和Sybase RDBMS上运行相同的查询。任何的想法?

3 个答案:

答案 0 :(得分:2)

您可以使用您尝试过的替换语句但是您应该测试“is null”而不是=''

WHERE REPLACE(PRODUCT_TYPE,' ','') is null

另见: null vs empty string in Oracle

答案 1 :(得分:2)

简单(非DBMS特定)答案是:

使用CHAR(15)

char(n)固定长度的数据类型。因此,无论您在那里存储什么,该值将始终填充到定义的长度。如果存储单个字符,DBMS将存储该单个字符和14个空格。

更改列以使用varchar(15),您应该没有任何问题。

答案 2 :(得分:2)

您可以在列上使用trim

where trim(product_type) is null

以上不是DBMS独立的,因为Sybase不提供trim功能。 但是,以下方法在Sybase和Oracle中都可以使用:

where rtrim(ltrim(product_type)) is null