问题描述
如果我们有一个如下所示的查询,其中 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
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