【问题标题】:Platform Neutral SQL Statement for INSTR or CHARINDEXINSTR 或 CHARINDEX 的平台无关 SQL 语句
【发布时间】:2009-02-12 19:41:38
【问题描述】:

我在为 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 标准。

【问题讨论】:

  • 为了更清楚,我需要拆分“。” - 我不知道点之前或之后有多少个字符。
  • +1 用于使用“平台中立”而不是“平台无关”。

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


【解决方案1】:

看着this link,我看不到实现您想要做的事情的标准方法。

ORACLE uses: INSTR
SQL SERVER uses: PATINDEX, CHARINDEX

ORACLE uses: SUBSTR
SQL SERVER uses: SUBSTRING

我想不出一个通用的方法来获取字符位置。

VIEW 可能是最简单的方法,或者在客户端应用程序中进行

【讨论】:

  • sqlzoo.net/fun_position 函数“Position”可以解决问题。我决定选择 bom_course_id 并在代码中拆分字符串,而不是强制 SQL 分隔字符串。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    你能把它转换成一个数字然后只取小数部分吗?

    【讨论】:

    • 不抱歉,我刚刚检查过,我不能依赖字符串都是数字。不过它会起作用的。
    【解决方案4】:

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

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

    【讨论】:

    • 不,很遗憾,我不能完全依赖数字。此外,我需要“。”右侧的子字符串。这几乎可以工作:SELECT DISTINCT bom_course_id - (CAST(CAST(bom_course_id AS FLOAT) AS INTEGER))
    【解决方案5】:

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

    Here 只是一个实现示例。

    编辑:阅读您的评论后,RIGHT 函数对您的情况并没有真正的帮助。然后您需要将相应的 SQL Server 函数映射到 Oracle。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      • 2013-07-09
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多