【问题标题】:Remove leading characters from strings从字符串中删除前导字符
【发布时间】:2020-08-26 17:07:37
【问题描述】:

我需要从字符串列中删除前导字符(下面的示例数据)。您会注意到这些值的前缀为 a.b.c. 以及可变数量的空格。我可以使用REPLACE 函数,但我需要为每个场景独立地这样做,因为空格的长度会有所不同。有没有一种巧妙的方法将这些去掉,以便输出行具有Name1Name2Name3

|---------------------------------------------------------|
|   ID  |                       Name                      |
|---------------------------------------------------------|
|   1   |   a.    Name1                                   |
|   2   |   b.          Name2                             |
|   3   |   c. Name3                                      |
|---------------------------------------------------------|

【问题讨论】:

  • 将字符串分割在第三个字符之后(或在“.”之后,取决于可变性)并修剪第二部分。

标签: sql-server


【解决方案1】:

您可以在 SQL Server 2017 中使用以下查询。

SELECT REPLACE(SUBSTRING(Name, CHARINDEX('.', [Name]), LEN([Name])), '.', '') 
FROM TableName

结果将符合您的预期。

【讨论】:

  • 谢谢@Kishan!我已使用您的解决方案稍作修改来处理 non-breaking space (ASCII 160)
  • 感谢@Dale 建议我正确的方式来发布答案并感谢您的编辑。
【解决方案2】:

类似的东西

select ID, trim(substring([Name], 3, len([Name])-2)) [Name]
from
  (values (1, 'a.    Name1        '),
          (2, 'b.          Name2                            '),
          (3, 'c. Name3')) v(ID, [Name]);

结果

ID  Name
1   Name1
2   Name2
3   Name3

【讨论】:

  • 谢谢@Steven! trim 对我不起作用,所以我用 LTRIM 替换了它。不过,有趣的是,SELECT LTRIM('      Name1') 并没有删除前导空格 - 是因为 SQL 认为它不是空格或其他东西吗?
  • 你试过 ltrim(rtrim(...)) 吗?
  • 是的,我做到了 - 结果相同。 select ltrim('      Name1'), ltrim(' Name1')。您会注意到第二个LTRIM 删除了空格,但第一个没有。在第二个中,我在Name1 之前手动添加了几个空格,而第一个是从数据库列中复制的。 (不确定是否将此语句复制粘贴到此处会将第一个转换为空格)
  • 我要试试 patindex。我认为也有一种xml方式来做到这一点
  • 我刚刚检查了ASCII 的值,它似乎是160,而不是正常的32,那是空间。这可能是LTRIM 无法删除它的原因。
猜你喜欢
  • 2011-04-09
  • 1970-01-01
  • 2011-04-24
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多