【发布时间】:2015-11-17 14:50:12
【问题描述】:
我准备了一个 SQL 查询,我必须在多个数据库(Oracle 和 Sybase)上运行,其中一些数据可能以不同的方式存储。
我注意到数据存储的差异之一是空白字符串。
比如下面的PRODUCT_TYPE一栏,请看第二条记录:
这个用红色圈起来的“空字符串”(数据类型为CHAR(15))在某些数据库中等于'',而在其他一些数据库中等于' '。长度永远不会是恒定的,并且有几个字段的行为是这样的。
所以,由于我需要过滤这些“空字符串”,我应该在我的WHERE 子句中更改以下语句:
WHERE PRODUCT_TYPE = ''
...因为上面将' ' 字符串与'' 不同,即使“功能上”不是这样。
因此,我想以“忽略空格”的方式发表声明,即 ' ' 等于 '' 等于 ' ' 等。
我应该如何进行此更改以使其正常工作?
我尝试了简单的替换方法:
WHERE REPLACE(PRODUCT_TYPE,' ','') = ''
...但它似乎不起作用,可能是因为我应该使用不同的字符。
为了测试,在下面的' 中有一个我在这些“空字符串”中找到的复制粘贴示例:
' '
理想情况下,它应该是“非特定 SQL”解决方案,因为我必须在 Oracle 和 Sybase RDBMS 上运行相同的查询。任何的想法?
【问题讨论】:
-
为什么两个数据库的查询必须完全相同?
-
如果
REPLACE(PRODUCT_TYPE,' ','')没有删除所有空格,那么您的字符与空格不同,例如回车或制表符或其他一些不可打印的字符。 -
@Thilo 这只是结果如何产生的问题。如果我们运行两种类型的查询(一种针对所有 Oracle 数据库,一种针对所有 Sybase 数据库,我们将获得两个单独的文件进行分析)。除非不能做出 IF Oracle ELSE 语句?我承认我不太擅长 SQL,希望您能在这方面提出建议。
-
拥有两个独立查询的想法是能够从它们中获取相同的标准化文件(以一种比尝试对两者都适用的单个查询更容易实现的方式)。我不确定哪种方式更适合这里。无论哪种方式,与多个数据库供应商合作都很麻烦,尤其是当您无法控制数据如何首先进入数据库时。
-
@MatteoNNZ 我明白了。现在你有一个强有力的技术想法来解释你的利益相关者。我赞成我认为好的和有帮助的答案。另外,赞成你的问题。顺便说一句,请确保下次您提供 create 和 insert 语句作为示例数据。或者,至少是一个带有示例模式的 SQL Fiddle。一切顺利:-)