使用CHARINDEX和SUBSTRING从字符串中获取括号之间的子字符串

时间:2014-08-21 14:53:52

标签: sql sybase

我需要的表达式是因为'-1'而失败('命令已被中止')。但没有这个'-1',它给了我一个太多的角色。

  

选择   SUBSTRING(M_COMMENT,CHARINDEX( '[',M_COMMENT)+ 1,CHARINDEX( ']',M_COMMENT)    - 来自TRN_EODA_DBF的CHARINDEX('[',M_COMMENT)-1)

但它与'+1'一起工作正常,我不明白。

  

选择   SUBSTRING(M_COMMENT,CHARINDEX( '[',M_COMMENT)+ 1,CHARINDEX( ']',M_COMMENT)    - 来自TRN_EODA_DBF的CHARINDEX('[',M_COMMENT)+1)

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

如果您的Sybase版本支持CROSS APPLY,则此方法非常有效:

SELECT
      CASE
            WHEN pos1 > 1 THEN SUBSTRING(M_COMMENT, pos1 + 1, CHARINDEX(']', M_COMMENT) - pos1 - 1)
            END
FROM TRN_EODA_DBF
      CROSS APPLY (
                  SELECT
                        CHARINDEX('[', M_COMMENT)
            ) ca (pos1)

+ EDIT!哦,亲爱的,是的。我输入了CROSS JOIN,但我的意思是CROSS APPLY - 非常抱歉

|                 INPUT |        OUTPUT | POS1 |
|-----------------------|---------------|------|
| admin@[sqlfiddle.com] | sqlfiddle.com |    7 |
|            @sqlfiddle |        (null) |    0 |
|         @jake[feasel] |        feasel |    6 |

例如

SELECT
       M_COMMENT as input
     , CASE
            WHEN pos1 > 1 THEN SUBSTRING(M_COMMENT, pos1 + 1, CHARINDEX(']', M_COMMENT) - pos1 - 1)
            END
       AS output
     , pos1
FROM TRN_EODA_DBF
      CROSS APPLY (
                  SELECT
                        CHARINDEX('[', M_COMMENT)
            ) ca (pos1)

如果没有交叉应用,你可以做同样的事情,但你重复使用charindex:

SELECT
       M_COMMENT as input
     , CASE
            WHEN CHARINDEX('[', M_COMMENT) > 1 THEN SUBSTRING(M_COMMENT, CHARINDEX('[', M_COMMENT) + 1, CHARINDEX(']', M_COMMENT) - CHARINDEX('[', M_COMMENT) - 1)
            END
       AS output
FROM TRN_EODA_DBF

Demo

答案 1 :(得分:0)

谢谢,我会试试这个。顺便说一下,我发现这篇非常详细的帖子解释了为什么我有这个错误消息:http://www.sql-server-helper.com/error-messages/msg-536.aspx

它说:“此错误是由于将负值传递给SUBSTRING,LEFT和RIGHT字符串函数的长度参数引起的。这通常与CHARINDEX函数一起发生,其中在字符串中搜索的字符不是找到并从CHARINDEX函数的结果中减去1。“

这正是这里发生的事情。