使用LIKE获取子字符串

时间:2014-04-12 19:33:14

标签: sql regex oracle ms-access

如何使用LIKE提取VARCHAR列的子字符串?

即。我有以下记录:

1: "@D.Test1 some text"
2: "some other text @D.Test3"
3: "text @D.Test1 text"
4: "text @D.Test14 text"

现在我想构建一个与模式匹配的唯一值列表。

SELECT DISTINCT DoSomethingToExpr(expr) AS output FROM tbl WHERE expr LIKE '%@%'

为了提取这些可变长度匹配,我应该用DoSomethingToExpr(expr)替换什么?我可以编写一个更复杂的模式来匹配完整的值,但我可以在哪里使用它?我没有看到任何直接的方法来使每个案例的实际子字符串函数都能很好地工作。我想要的输出是这样的:

1: @D.Test1
2: @D.Test3
3: @D.Test14

我同时使用Oracle和MS-Access,因此最好能够适应两者的解决方案。

2 个答案:

答案 0 :(得分:2)

它不漂亮,但这是使用基本字符串函数的解决方案:

SELECT SUBSTRING(
          expr, 
          CHARINDEX( '@', expr ), 
          ISNULL( 
            NULLIF( 
              CHARINDEX( ' ', expr, CHARINDEX( '@', expr ) ), 
              0 ), 
            LEN( expr ) ) 
          - CHARINDEX( '@', expr ) + 1 )
       AS output
FROM   tbl
WHERE  expr LIKE '%@%'

当然,这有一些缺点。它期望@D.Test…字符串后跟空格或字符串的结尾。如果它可以跟随任何其他角色,你必须调整它。但是,如果您想要做的不仅仅是复杂的事情,那么最好不要在应用程序代码而不是SQL中执行此操作。

答案 1 :(得分:0)

不幸的是,您无法在SQL中使用Regex。在SQL中,您只能使用通配符测试文本是否与模式匹配;但是,您无法使用这些通配符以简单的方式提取匹配的子字符串。

我建议你在查询和前端之间拆分逻辑。查询只会测试" @"的存在。例如,前端会对VBA中返回的记录或您正在使用的任何语言执行更复杂的处理。