我准备了一个SQL查询,我必须在几个数据库(Oracle和Sybase)上运行,其中一些数据可能以不同方式存储。
我注意到数据存储的一个区别是空字符串。
例如,在下面的PRODUCT_TYPE
列中,请查看第二条记录:
这个"空字符串" (数据类型为CHAR(15)
)在某些数据库中以红色圈出等于''
,而对于其他数据库则等于' '
。长度永远不会是常数,并且有几个字段表现如此。
因此,由于我需要对这些"空字符串"进行过滤,我应该在WHERE
子句中更改以下语句:
WHERE PRODUCT_TYPE = ''
...因为上述内容会使' '
字符串与''
不同,即使"功能正常"说话不是。
因此,我想以这样的方式发表声明,即它忽略空格",即' '
等于''
,等于' '
等。
我应该如何进行此更改才能使其正常工作?
我尝试过简单的替换方法:
WHERE REPLACE(PRODUCT_TYPE,' ','') = ''
......但它似乎没有用,可能是因为我应该使用不同的角色。
为了测试,在下面的'
里面有一个复制粘贴的例子,我在这些"空字符串中找到了什么":
' '
理想情况下,它应该是一个非特定的SQL"因为我必须在Oracle和Sybase RDBMS上运行相同的查询。任何的想法?
答案 0 :(得分:2)
您可以使用您尝试过的替换语句但是您应该测试“is null”而不是=''
WHERE REPLACE(PRODUCT_TYPE,' ','') is null
答案 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