【问题标题】:Substring not working in all my cases, how could I fix it?子字符串在我的所有情况下都不起作用,我该如何解决?
【发布时间】:2019-07-10 10:23:29
【问题描述】:

我有一个有效的子字符串查询,但如果在我搜索的查询之后没有任何措辞,它就会中断。我不知道如何解决它。

我尝试在 len 之后删除和更改数字 +1 +2 -1 -2 但没有机会让它工作。

declare 
@FullText nvarchar(400) = 'My Code in ''ABC123, CDE456'' and my digit 1',
@KnownBeginning nvarchar(400) = 'Code in ''',
@KnownEnding nvarchar(400) = ''' '

select SUBSTRING(@FullText, CHARINDEX(@KnownBeginning, @FullText) + LEN(@KnownBeginning) , 
            CHARINDEX(@KnownEnding,@FullText) - (CHARINDEX(@KnownBeginning, @FullText)
            + LEN(@KnownBeginning)))


--@FullText2 nvarchar(400) = 'My Code in ''ABC123, CDE456'''

上面的代码可以工作,但是如果我们将@FullText 替换为@FullText2,在'' - “and my digit 1”之后没有文本,则选择会中断。 如果在找到搜索的字符串之后有任何文本,则子字符串似乎有效。但是如果在 ''ABC123, CDE456'' 之后没有其他内容,它会说:

消息 537,第 16 级,状态 3,第 7 行 传递给 LEFT 或 SUBSTRING 函数的长度参数无效。

如果引号后有或没有文本,则选择应始终返回。

【问题讨论】:

    标签: sql-server tsql substring


    【解决方案1】:

    你可以试试这个:

    DECLARE @tbl TABLE(YourString VARCHAR(100));
    INSERT INTO @tbl VALUES
     ('My Code in ''ABC123, CDE456'' and my digit 1')
    ,('My Code in ''ABC123, CDE456''');
    
    SELECT t.YourString
          ,A.CastedToXml.query('.') AS ThisIsHowItLooksLike
          ,A.CastedToXml.value('/x[2]','varchar(100)') AS TheSecondElement
    FROM @tbl t
    CROSS APPLY(SELECT CAST('<x>' + REPLACE(t.YourString,'''','</x><x>') + '</x>' AS XML)) A(CastedToXml);
    

    单击 XML 节点以查看中间转换值。我们可以使用.value() 选择第二个&lt;x&gt;,这是您的数据。

    您也可以按照自己的方法进行操作:

    DECLARE @KnownBeginning nvarchar(400) = 'Code in ''', 
            @KnownEnding nvarchar(400) = ''''; --<-- Without the blank!
    
    SELECT t.YourString
          ,SUBSTRING(t.YourString,A.StartPosition,B.EndPosition-A.StartPosition) AS TheCodes
    FROM @tbl t
    CROSS APPLY(SELECT CHARINDEX(@KnownBeginning,t.YourString) + LEN(@KnownBeginning)) A(StartPosition)
    OUTER APPLY(SELECT CHARINDEX(@KnownEnding,t.YourString,A.StartPosition+1)) B(EndPosition);
    

    我使用APPLY 来计算值逐行。这允许在程序方法中使用类似于变量的计算值。第一个 APPLY 计算起点,而第二个 APPLY 使用 StartPosition 作为偏移量。因此,我们不需要引号后的空格。

    【讨论】:

    • 知道了! :) 谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2023-03-18
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多