【问题标题】:CHARINDEX and LENCHARINDEX 和 LEN
【发布时间】:2018-09-15 20:22:43
【问题描述】:

我在 name 列中有字符串 anyname#

我需要忽略#

我尝试使用LEFT (name, CHARINDEX ('#', name) - 1),但没有成功,但使用LEFT (name, LEN (name) - 1)可以正常使用。

CHARINDEXLEN 都返回整数值

您能解释一下为什么我不能将 - 1CHARINDEX 一起使用,而是与LEN 一起使用吗?

【问题讨论】:

  • 服务器出了点问题,导致它无法正常工作。它已重新启动,然后按应有的方式上线。

标签: sql-server


【解决方案1】:
  • LEFT (name,LEN(name) - 1) 只会忽略最后的包机。

  • LEFT (name, CHARINDEX('#', name) - 1) 会找到# 包机显示位置号。

在你的情况下,我会使用 replace 函数来忽略 # replace(name,'#','')

这是一个示例 # 没有显示在最后的章程中。

CREATE TABLE T(name varchar(50));

INSERT INTO T VALUES ('anyn#ame');

select LEFT (name, CHARINDEX ('#', name) - 1), 
       LEFT(name, LEN (name) - 1),
       replace(name,'#','')
from t

sqlfiddle

【讨论】:

  • 217/5000 是的,我知道方法,LEN () 只会忽略最后一个字符,CHARINDEX () 会忽略位置。但重点是,两者都返回整数值,但在LEFT 函数中不接受以相同方式使用。
  • @RafaelBueno 在你的情况下LEN (name) - 1CHARINDEX ('#', name) - 1 结果是一样的。
  • 这些值是相同的,但我不能将这些值用作 LEFT 函数的长度,正如我所展示的那样。
  • 同样可以dbfiddle.uk/…
  • 我表中的列是 nvarchar 并且不工作。您向我显示此错误:**1 将 nvarchar 值“RAFAEL BUENO#”转换为数据类型 int 时转换失败。 **
【解决方案2】:

虽然不是你要找的解释,但你为什么不能使用TRIM() finction like

SELECT TRIM( '#' FROM  'anyname#') AS col

【讨论】:

  • 239/5000 正如您已经说过的,这不是我寻求的解释。我的例子只是为了说明如果有必要删除最后一个字符,无论如何,因为我可以在LEFT 中使用LEN () - 1 而不是CHARINDEX () - 1
猜你喜欢
  • 2019-06-28
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 2022-11-23
  • 1970-01-01
相关资源
最近更新 更多