【问题标题】:CHARINDEX not able to retrieve index in a stringCHARINDEX 无法检索字符串中的索引
【发布时间】:2021-02-23 06:22:12
【问题描述】:

如果我们有一个如下所示的查询,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,在这种情况下我们如何获取索引位置?

【问题讨论】:

  • CAST([col] AS varchar)) 必须是 CAST([col] AS varchar(max))) - 您必须始终指定 varcharnvarchar 的长度。

标签: sql sql-server charindex


【解决方案1】:

删除查询中的CAST 函数。

这里不需要将数据类型转换为VARCHAR。因为在下面的select语句中已经转换成NVARCHAR(4000)了。

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

SELECT t.*, CHARINDEX('text', [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

【讨论】:

    【解决方案2】:

    您的问题几乎是一个错字,您正在转换为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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-22
      • 1970-01-01
      • 2016-02-03
      • 2016-04-05
      • 1970-01-01
      相关资源
      最近更新 更多