INSTR或CHARINDEX的平台中性SQL语句

时间:2009-02-12 19:41:39

标签: sql sql-server oracle standards platform-independent

我在为Oracle和MS SQL服务器编写SQL语句时遇到问题。我想编写SQL以便它可以在两者中工作。我不想乱用设置数据库类型变量和切换

我有一列课程名称,其值如下:

  

9RA923.2008W

     

1223.200710

     

P0033330.200901

我想选择“。”的所有内容。

在oracle中我正在使用它:

SELECT substr(bom_course_id, instr(bom_course_id, '.')+1) FROM ...

在MSSQL Server中,我可以使用它:

SELECT SUBSTRING(bom_course_id, CHARINDEX('.', bom_course_id)+1 ) FROM ...

有没有人能够巧妙地选择点后的最后一个字符,在Oracle或MS SQL中使用相同的SQL语句。

不幸的是,我不知道“。”之前或之后会有多少个字符。 它也不是完全数字,我不能只指望数字。

我真的希望有一个SQL标准。

5 个答案:

答案 0 :(得分:1)

您是否考虑过将数据库隐藏在数据库视图中? 从应用程序的角度来看,它只是一个普通的,没有函数的vanilla,并且所有特定于数据库的东西都保留在数据库中。

可能不适合所有人,但这是一个想法。

答案 1 :(得分:1)

this link,我看不到达到你想做的标准方法。

ORACLE uses: INSTR
SQL SERVER uses: PATINDEX, CHARINDEX

ORACLE uses: SUBSTR
SQL SERVER uses: SUBSTRING

我想不出一个获得角色位置的常用方法。

VIEW 可能是在客户端应用程序中继续或的最简单方法。

答案 2 :(得分:0)

你可以将它转换为数字,然后只取小数部分吗?

答案 3 :(得分:0)

如果两个数据库的区域设置相同,则可以使用

SELECT DISTINCT CAST(CAST(bom_course_id AS FLOAT) AS INTEGER)

答案 4 :(得分:0)

您可以编写一个名为RIGHT的Oracle函数,它与SQL Server一样,然后在SQL中使用它。

Here只是一个实现的例子。

编辑:阅读完评论后,正确的功能对您的情况不会有帮助。然后,您需要将相应的SQL Server函数映射到Oracle。