SQL和正则表达式检查字符串是否是更大字符串的子字符串?

时间:2011-08-05 06:36:53

标签: regex ios core-data predicate

我的数据库中填充了一些代码,例如

EE789323
     990
   78000

这些数字总是更大代码的结尾。现在我有一个函数需要检查更大的代码是否包含子代码。

因此,如果我有代码90990且我的完整代码为EX888990,那么它应该匹配它们。

但是我需要按照以下方式进行:

SELECT * FROM tableWithRecordsWithSubcode
 WHERE subcode MATCHES [reg exp with full code];

这样的正则表达式甚至可能吗?

修改

为了澄清我遇到的问题,我不是在这里使用SQL。我只是用它来举例说明我正在使用的查询类型。 事实上我正在使用带有CoreData的iOS,我需要一个谓词才能获取匹配的记录。 按照下面提到的方式。

2 个答案:

答案 0 :(得分:0)

我不确定您为什么认为需要正则表达式...只需使用charindex函数:

select something
from table
where charindex(code, subcode) <> 0

编辑:

要在最后找到字符串,您可以使用子代码中的%通配符创建一个模式:

select something
from table
where '%' + subcode like code

答案 1 :(得分:0)

鉴于评论的意见:

  

你有两个表,一个叫做tableWithRecordsWithSubcode,另一个可能是tableWithFullCodeColumn?所以匹配条件部分是连接 - 你需要知道哪些子代码匹配第二个表中的任何完整代码?但是你只对tableWithRecordsWithSubcode表中的信息感兴趣,而不是它在另一个表中匹配的行?

和简洁的“你是对的”回应,然后我们必须在某种程度上重写查询。

SELECT DISTINCT S.*
  FROM tableWithRecordsWithSubcode AS S
  JOIN tableWithFullCodeColumn     AS F
    ON F.Fullcode ...ends-with... S.Subcode

或者可能使用EXISTS子查询:

SELECT S.*
  FROM tableWithRecordsWithSubcode AS S
 WHERE EXISTS(SELECT * FROM tableWithFullCodeColumn AS F
               WHERE F.Fullcode ...ends-with... S.Subcode)

这使用相关的子查询,但避免了DISTINCT操作;这可能意味着优化器可以更有效地工作。

这样就可以定义神奇的'X ... ends-with ... T'操作符。一种可能的方法是使用LENGTH和SUBSTR。但是,SUBSTR在所有DBMS中的行为都不一样,所以你可能不得不修改它(可能添加第三个参数LENGTH(s.subcode)):

LENGTH(f.fullcode) >= LENGTH(s.subcode) AND
SUBSTR(f.fullcode, LENGTH(f.fullcode) - LENGTH(s.subcode)) = s.subcode

这导致两种可能的配方:

SELECT DISTINCT S.*
  FROM tableWithRecordsWithSubcode AS S
  JOIN tableWithFullCodeColumn     AS F
    ON LENGTH(F.Fullcode) >= LENGTH(S.Subcode)
   AND SUBSTR(F.Fullcode, LENGTH(F.Fullcode) - LENGTH(S.Subcode)) = S.Subcode;

SELECT S.*
  FROM tableWithRecordsWithSubcode AS S
 WHERE EXISTS(
       SELECT * FROM tableWithFullCodeColumn AS F
        WHERE LENGTH(F.Fullcode) >= LENGTH(S.Subcode)
          AND SUBSTR(F.Fullcode, LENGTH(F.Fullcode) - LENGTH(S.Subcode)) = S.Subcode);

这不会是一个快速的操作;连接计算结果,例如此查询所需的结果很少。