如何使用 T-SQL 替换字符串中的字符
How to replace a character in a string using T-SQL
在我的 table 专栏中,我有以下样本数据
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 行中,“,”已替换为空 space。
我试过这个 Replace(column1, ', ', '') AS ColName
但这会替换 Test1 和 Test3 中的所有“,”。
你可以试试这个:
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;
像这样:
SELECT CASE
WHEN Column1 LIKE '%,' THEN STUFF(column1, LEN(column1), 1, '')
ELSE Column1
END
我很确定 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
您也可以这样做 LIKE
和 IIF
:
SELECT IIF(t.Column LIKE '%,' , LEFT(t.column, LEN(t.column) - 1) , t.column) as new_val
FROM YourTable t
对于旧版本: 您可以使用 CASE EXPRESSION
因为 IIF
仅在 2012+ 版本之后可用(Link @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
这显示了一种方法。
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';
在我的 table 专栏中,我有以下样本数据
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 行中,“,”已替换为空 space。
我试过这个 Replace(column1, ', ', '') AS ColName
但这会替换 Test1 和 Test3 中的所有“,”。
你可以试试这个:
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;
像这样:
SELECT CASE
WHEN Column1 LIKE '%,' THEN STUFF(column1, LEN(column1), 1, '')
ELSE Column1
END
我很确定 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
您也可以这样做 LIKE
和 IIF
:
SELECT IIF(t.Column LIKE '%,' , LEFT(t.column, LEN(t.column) - 1) , t.column) as new_val
FROM YourTable t
对于旧版本: 您可以使用 CASE EXPRESSION
因为 IIF
仅在 2012+ 版本之后可用(Link @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
这显示了一种方法。
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';