【问题标题】:SQL for extract portion of a string用于提取字符串部分的 SQL
【发布时间】:2011-02-17 19:30:14
【问题描述】:

我有一个存储在文本字段(字符串)中的邮政编码,并且想在我的选择语句中只选择值的最后 3 位数字。这可能吗?是否有这样做的标准方法,以便 SQL 可以跨数据库互换?我将在 Oracle 的生产环境中使用它,但我在 Interbase 上进行测试(是的,是的,我知道,两个完全不同的数据库,但这就是我正在做的)

感谢您提供的任何帮助

【问题讨论】:

  • 没有子字符串/正确的命令可以在 Oracle 和 Interbase 上运行 using the same code

标签: sql oracle delphi interbase


【解决方案1】:

假设邮政编码都具有相同的长度,您可以使用substr
如果它们的长度不同,则必须使用 strlen 函数做类似的事情。

Interbase 没有内置的子字符串函数,但它在 lib_udf.dll 中有一个名为 SUBSTRUDF(用户定义函数),其工作方式如下:

select substr(clients.lastname, 1, 10)
from clients

您像这样声明 UDF:

DECLARE EXTERNAL FUNCTION SUBSTR
    CSTRING(80),
    SMALLINT,
    SMALLINT
RETURNS CSTRING(80) FREE_IT
ENTRY_POINT 'IB_UDF_substr' MODULE_NAME 'ib_udf';

Oracle 确实有一个内置的 substr 函数,您可以这样使用:

select substr(clients.lastname, 1, 10)
from clients

--杰罗恩

【讨论】:

    【解决方案2】:

    这取决于您存储邮政编码的方式。如果您只使用 5 位数字 那么这应该适用于 Oracle 并且可能适用于 Interbase。

    select * from table where substr(zip,3,3) = '014'
    

    如果您存储 Zip + 4 并且您想要最后 3 位数字,有些是 5 位数字,有些是 9 位数字,您必须执行以下操作。

    select * from table where substr(zip,length(zip) -2,3) = '014'
    

    在这两个数据库中可能会更好的一个选项是

    select * from table where zip like '%014'
    

    【讨论】:

    • 没有 where 子句。每条记录都有一个 zip,因此,我需要每个记录的最后三个字符。一个可以在两个数据库中使用的。谢谢!
    • 要将其放入选择中,只需将表达式 substr(....) 移至 SELECT 子句...如上所述,没有适用于 Oracle 和 Interbase 的命令
    • 你对这两个都有答案吗,所以我可以在需要时来回更改 - 谢谢!
    猜你喜欢
    • 2017-11-15
    • 1970-01-01
    • 2021-09-29
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    相关资源
    最近更新 更多