sql - Firebird 数据库在字段上拆分字符串

标签 sql firebird

目前正在使用 Firebird 1.5 数据库并尝试使用 SQL 以 native 正确的格式提取数据。

考虑以下数据库:

ID | Full Name
 1   Jon Doe
 2   Sarah Lee 

我想要实现的是在查询中对全名字段(空格)进行简单拆分。

ID | First Name | Last Name
1     Jon          Doe
2     Sarah        Lee 

面临的问题是 Firebird POSITION() 是在 v2.0 中引入的。是否有任何已知的解决方法来拆分任何人遇到的空间?

非常感谢您的帮助!

最佳答案

对于 Firebird 1.5,一个解决方案是找到一个 UDF,它要么结合这两个功能,要么提供位置(我不使用 UDF,所以我不确定是否已经存在)。如果没有可用的,您可能需要写一个。

另一种解决方案是为此功能编写存储过程,例如:Position of substring function in SP

CREATE PROCEDURE Pos (SubStr VARCHAR(100), Str VARCHAR(100))
  RETURNS (Pos INTEGER) AS
DECLARE VARIABLE SubStr2 VARCHAR(201); /* 1 + SubStr-lenght + Str-length */
DECLARE VARIABLE Tmp VARCHAR(100);
BEGIN
  IF (SubStr IS NULL OR Str IS NULL)
  THEN BEGIN Pos = NULL; EXIT; END

  SubStr2 = SubStr || '%';
  Tmp = '';
  Pos = 1;
  WHILE (Str NOT LIKE SubStr2 AND Str NOT LIKE Tmp) DO BEGIN
    SubStr2 = '_' || SubStr2;
    Tmp = Tmp || '_';
    Pos = Pos + 1;
  END

  IF (Str LIKE Tmp) THEN Pos = 0;
END

此示例(取自链接)可以扩展为然后使用 SUBSTRING在空间上 split 。

对于像空格这样的单个字符的搜索,可能可以设计出比上述存储过程更简单的解决方案。为了您的确切需求,您可能需要专门为此目的编写一个可选择的存储过程。

但是,将您的数据库升级到 Firebird 2.5 会给您更多powerful internal functions可以简化此查询(以及您的生活)!

关于sql - Firebird 数据库在字段上拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23947502/

相关文章:

mysql - ORDER BY 列中相似值的数量

sql - 如何将复合主键插入到另一个表中?

c++ - 未定义对soci::session::get_last_insert_id的引用

Delphi - Firebird - Vista 访问套接字被拒绝

java - Firebird 与 Java 的连接

mysql - LEFT JOIN 右表中缺少值

sql - 计算按某些行分组的出现次数

asp.net - 您如何看待 Postgres 和 Firebird 数据库?

c++ - 在 OS X 上构建 Qt QIBASE 驱动程序

delphi - 在Delphi中使用DBExpress创建数据库?