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

Bro*_*die 3 sql firebird

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

考虑以下数据库:

ID | Full Name
 1   Jon Doe
 2   Sarah Lee 
Run Code Online (Sandbox Code Playgroud)

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

ID | First Name | Last Name
1     Jon          Doe
2     Sarah        Lee 
Run Code Online (Sandbox Code Playgroud)

面临的问题是 Firebird POSITION() 是在 v2.0 中引入的。是否有任何已知的解决方法可以在任何人遇到过的空间上进行分割?

非常感谢您的帮助!

Mar*_*eel 5

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

另一种解决方案是为此功能编写一个存储过程,例如: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
Run Code Online (Sandbox Code Playgroud)

这个示例(取自链接)可以扩展,然后用于SUBSTRING分割空间。

对于搜索单个字符(例如空格),可能可以设计比上述存储过程更简单的解决方案。为了满足您的具体需求,您可能需要专门为此目的编写一个可选择的存储过程。

然而,将数据库升级到 Firebird 2.5 将为您提供更强大的内部功能,从而简化此查询(以及您的生活)!