简体   繁体   English

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

[英]Use of CHARINDEX and SUBSTRING to get a substring between brackets from a string

The expression I'd need is that but it fails ('Command has been aborted') because of the '-1'. 我需要的表达式是,但是由于“ -1”而失败(“命令已中止”)。 But without this '-1' it gives me one character too many. 但是,如果没有这个“ -1”,它将给我一个字符太多。

select SUBSTRING(M_COMMENT,CHARINDEX('[',M_COMMENT)+1,CHARINDEX(']',M_COMMENT) - CHARINDEX('[',M_COMMENT)-1) from TRN_EODA_DBF 从TRN_EODA_DBF中选择SUBSTRING(M_COMMENT,CHARINDEX('[',M_COMMENT)+ 1,CHARINDEX(']',M_COMMENT)-CHARINDEX('[',M_COMMENT)-1)

But it works fine with the '+1' which I don't understand. 但这对我不了解的“ +1”效果很好。

select SUBSTRING(M_COMMENT,CHARINDEX('[',M_COMMENT)+1,CHARINDEX(']',M_COMMENT) - CHARINDEX('[',M_COMMENT)+1) from TRN_EODA_DBF 从TRN_EODA_DBF中选择SUBSTRING(M_COMMENT,CHARINDEX('[',M_COMMENT)+ 1,CHARINDEX(']',M_COMMENT)-CHARINDEX('[',M_COMMENT)+1)

Thanks for your help. 谢谢你的帮助。

If your version of Sybase supports CROSS APPLY this works approach quite well: 如果您的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! +编辑! Oh dear, sory. 哦,亲爱的,很抱歉。 I typed CROSS JOIN, but I meant CROSS APPLY - very sorry 我输入了CROSS JOIN,但是我的意思是CROSS APPLY-非常抱歉

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

example

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)

Without cross apply you can do the same thing but you repeat use of charindex instead: 没有交叉应用,您可以做同样的事情,但是您重复使用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 演示版

Thanks, I'll try this one. 谢谢,我会尝试这个。 By the way I found this very detailed post explaining why I have this error message: http://www.sql-server-helper.com/error-messages/msg-536.aspx 顺便说一下,我发现了这篇非常详细的帖子,解释了为什么我收到此错误消息: http : //www.sql-server-helper.com/error-messages/msg-536.aspx

It says:"This error is caused by passing a negative value to the length parameter of the SUBSTRING, LEFT and RIGHT string functions. This usually occurs in conjunction with the CHARINDEX function wherein the character being searched for in a string is not found and 1 is subtracted from the result of the CHARINDEX function." 它说:“此错误是通过将负值传递给SUBSTRING,LEFT和RIGHT字符串函数的长度参数引起的。通常与CHARINDEX函数结合使用,在该函数中找不到要在字符串中搜索的字符,并且1从CHARINDEX函数的结果中减去。”

This is exactly what happens here. 这正是这里发生的情况。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM