【问题标题】:How to replace a character in a string using T-SQL如何使用 T-SQL 替换字符串中的字符
【发布时间】:2016-10-10 03:45:13
【问题描述】:

在我的表格列中,我有以下示例数据

Test1 145,  Area 1
Test2 146,
Test3 145,  Area 2, Plot 10

我想要实现的是替换字符串中的“,”,但前提是它是最后一个字符。如果我在“,”之后有更多字符,那么替换应该保持字符串不变。

在上面的例子中,替换只在第 2 行起作用。

预期的输出如下所示

Test1 145,  Area 1
Test2 146 
Test3 145,  Area 2, Plot 10

在上面的第 2 行中,"," 已被替换为空格。

我已经尝试过这个Replace(column1, ', ', '') AS ColName,但这会替换 Test1 和 Test3 中的所有“,”。

【问题讨论】:

标签: sql-server tsql sql-server-2005


【解决方案1】:

你可以试试这个:

DECLARE @value VARCHAR(1024) = 'Test2 146,';

SELECT IIF(RIGHT(@value,1) = ',', LEFT(@value, LEN(@value) - 1), @value);

对于列,如下所示:

DECLARE @DataSource TABLE
(
    [value] VARCHAR(1024)
);

INSERT INTO @DataSource ([value])
VALUES ('Test1 145,  Area 1')
      ,('Test2 146,')
      ,('Test3 145,  Area 2, Plot 10');


SELECT IIF(RIGHT([value],1) = ',', LEFT([value], LEN([value]) - 1), [value])
FROM @DataSource;

【讨论】:

  • 看起来 IIF 仅在 2012+ 年可用
  • 您可以使用CASE 声明 - 检查下面的答案。
【解决方案2】:

LIKEIIF 也可以这样做:

SELECT IIF(t.Column LIKE '%,' , LEFT(t.column, LEN(t.column) - 1) , t.column) as new_val
FROM YourTable t

对于旧版本:您可以使用CASE EXPRESSION,因为IIF 仅在2012+ 版本之后可用(链接@gotqn)

SELECT CASE WHEN t.Column LIKE '%,' 
            THEN LEFT(t.column, LEN(t.column) - 1) 
            ELSE t.column
       END as new_val
FROM YourTable t

【讨论】:

  • 当然,我也刚刚注意到它被标记为 2005,因此不适用于 OP。但它适用于将来在这里偶然发现的其他人。
  • IIF 不起作用,但案例不会吗?或者这里的另一个功能在那个版本中也没有?
  • CASE 可以 - IIF 来自 2012+ 版本 (msdn.microsoft.com/en-us/library/hh213574.aspx)
  • 是的,对不起,我的评论不是很清楚。 case 表达式应该可以正常工作。 IIF 版本也应该可以使用,但不太可能像 2005 年那样适用于 OP。
  • 我刚刚测试了 case 表达式但仍然没有工作,我发现正在工作的是@nscheaffer 的答案。
【解决方案3】:

我很确定 IIF 在 SQL Server 2005 中不可用。这与之前使用 CASE 的答案的逻辑基本相同。

declare @MyString varchar(50)

set @MyString = 'Test2 146,'

select 
case
    when right(rtrim(@MyString), 1) = ',' then
        substring(@MyString, 1, len(rtrim(@MyString)) - 1)
    else
        @MyString
end

【讨论】:

    【解决方案4】:

    类似这样的:

    SELECT CASE 
              WHEN Column1 LIKE '%,' THEN STUFF(column1, LEN(column1), 1, '') 
              ELSE Column1
           END
    

    【讨论】:

      【解决方案5】:

      这显示了一种方法。

      DECLARE @test VARCHAR(30);
      
      SET @test = 'Test1, 145, Area 1';
      
      SELECT @test;
      
      IF CHARINDEX(',', @test, LEN(RTRIM(@test))) > 0
      BEGIN
          SET @test = Replace(@test, ',', '');
      END
      
      SELECT @test;
      
      SET @test = 'Test2 146,';
      
      SELECT @test;
      
      IF CHARINDEX(',', @test, LEN(RTRIM(@test))) > 0
      BEGIN
          SET @test = Replace(@test, ',', '');
      END
      
      SELECT @test;
      
      SET @test = 'Test3 145, Area 2, Plot 10';
      
      SELECT @test;
      
      IF CHARINDEX(',', @test, LEN(RTRIM(@test))) > 0
      BEGIN
          SET @test = Replace(@test, ',', '');
      END
      
      SELECT @test;
      

      -- 如何在 SELECT 语句中工作

      SET @test = 'Test2 146,';
      
      SELECT CASE WHEN CHARINDEX(',', @test, LEN(RTRIM(@test))) > 0 THEN SUBSTRING(@test, 1, LEN(@test) - 1) ELSE @test END AS 'Converted Value';
      

      【讨论】:

        猜你喜欢
        • 2021-01-20
        • 2011-05-20
        • 2015-05-14
        • 2020-08-12
        • 2012-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多