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

时间:2014-05-30 05:15:25

标签: sql firebird

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

考虑以下数据库:

ID | Full Name
 1   Jon Doe
 2   Sarah Lee 

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

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

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

非常感谢您的协助!

3 个答案:

答案 0 :(得分:3)

对于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分割空间。

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

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

答案 1 :(得分:0)

您可以使用UDF,但这不是严格的SQL

你可以写一个存储过程来解析和拆分,但那不是严格的SQL

答案 2 :(得分:0)

我还想将全名字​​符串拆分为名字和姓氏,我在firebird 2.1数据库中使用了以下SQL语句:

患者是表名。 名称字段包含全名字符串,例如:“Jon Doe”。 FIRST_NAME 字段将存储名字, LAST_NAME 字段将存储姓氏

首先获取第一个名称(第一个空格之前的字符串部分)并执行TRIM UPDATE语句以删除任何空格。

UPDATE "Patients" SET "Patients".FIRST_NAME = (SUBSTRING("Patients"."Name" FROM 1 FOR (POSITION(' ' IN "Patients"."Name"))))
UPDATE "Patients" SET "Patients".FIRST_NAME = TRIM(BOTH ' ' FROM "Patients".FIRST_NAME)

然后获取姓氏(第一个空格后的字符串)并执行TRIM UPDATE语句以删除任何空格

UPDATE "Patients" SET "Patients"."LAST_NAME" = (SUBSTRING("Patients"."Name" FROM (POSITION(' ' IN "Patients"."Name")+1)))
UPDATE "Patients" SET "Patients".LAST_NAME = TRIM(BOTH ' ' FROM "Patients".LAST_NAME)

结果将是:

ID | NAME      | FIRST_NAME | LAST_NAME
1    Jon Doe     Jon          Doe
2    Sarah Lee   Sarah        Lee