我的数据库中填充了一些代码,例如
EE789323
990
78000
这些数字总是更大代码的结尾。现在我有一个函数需要检查更大的代码是否包含子代码。
因此,如果我有代码90
和990
且我的完整代码为EX888990
,那么它应该匹配它们。
但是我需要按照以下方式进行:
SELECT * FROM tableWithRecordsWithSubcode
WHERE subcode MATCHES [reg exp with full code];
这样的正则表达式甚至可能吗?
修改
为了澄清我遇到的问题,我不是在这里使用SQL。我只是用它来举例说明我正在使用的查询类型。 事实上我正在使用带有CoreData的iOS,我需要一个谓词才能获取匹配的记录。 按照下面提到的方式。
答案 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);
这不会是一个快速的操作;连接计算结果,例如此查询所需的结果很少。