CHARINDEX 无法检索字符串中的索引

问题描述

如果我们有一个如下所示的查询,其中 CHARINDEX 应该在给定的列中找到字符串的索引,但结果不是预期的。有没有其他方法可以检索索引?

SELECT t.*,CHARINDEX('text',CAST([col] AS varchar)) AS [out]
FROM (
    SELECT CAST([col] AS NVARCHAR(4000)) AS [col] 
    FROM (
         VALUES ('"http:\/\/xxxxx.share.com\/text"'),('random content in string :\/\\//\ / text \\\''''''')
    ) AS t0([col])
) t

结果是

col                                                 |  out
"http:\/\/xxxxx.share.com\/text"                    |    0
random content in string :\/\\//\ / text \\\''''''  |    0

但是如果我希望输出

col                                                 |  out
"http:\/\/xxxxx.share.com\/text"                    |   28
random content in string :\/\\//\ / text \\\''''''  |   36

由于 text 字符分别在行中的 28/36,在这种情况下我们如何获取索引位置?

解决方法

您的问题几乎是一个错字,并且您正在强制转换为 VARCHAR,这可能不是实际适合所有数据的合适长度。只需转换为足够长的长度以容纳您的数据,您的查询就可以正常工作:

SELECT t.*,CHARINDEX('text',CAST([col] AS varchar(255))) AS [out]  -- change is here
FROM (
    SELECT CAST([col] AS NVARCHAR(4000)) AS [col] 
    FROM (
         VALUES ('"http:\/\/xxxxx.share.com\/text"'),('random content in string :\/\\//\ / text \\\''''''')
    ) AS t0([col])
) t

screen capture from demo link below

Demo

,

删除查询中的 CAST 函数。

此处无需将数据类型转换为 VARCHAR。因为它已经在下面的 select 语句中转换为 NVARCHAR(4000)

如果需要,请使用 CAST([col] AS varchar(max))) 而不是 CAST([col] AS varchar))

SELECT t.*,[col] ) AS [out]
FROM (
SELECT CAST([col] AS NVARCHAR(4000)) AS [col] 
FROM (
     VALUES ('"http:\/\/xxxxx.share.com\/text"'),('random content in string :\/\\//\ /text \\\''''''')
) AS t0([col])
) t