我在SQL Server数据库中有一个带有NTEXT列的表。此列可能包含用双引号括起来的数据。当我查询此列时,我想删除这些前导和尾随引号。
例如:
“这是测试消息”
应该成为
这是测试消息
我知道LTRIM和RTRIM函数,但这些函数仅适用于空格。关于我可以使用哪些功能来实现这一目标的任何建议。
答案 0 :(得分:53)
我刚刚在MS SQL 2008中测试了这段代码并对其进行了验证。
删除最左边的引用:
UPDATE MyTable
SET FieldName = SUBSTRING(FieldName, 2, LEN(FieldName))
WHERE LEFT(FieldName, 1) = '"'
删除最右边的引用:(修改以避免从隐式类型转换到int的错误)
UPDATE MyTable
SET FieldName = SUBSTRING(FieldName, 1, LEN(FieldName)-1)
WHERE RIGHT(FieldName, 1) = '"'
答案 1 :(得分:25)
如果你想删除所有引号,我认为这是一个更简单的脚本
UPDATE Table_Name
SET col_name = REPLACE(col_name, '"', '')
答案 2 :(得分:3)
我知道这是一个较旧的问题帖子,但我的女儿带着问题来找我,并将此页面引用为可能的答案。鉴于她正在为此寻找答案,这是一个安全的假设,其他人可能仍然如此。
所有这些都是很好的方法,就像所有东西一样,有很多方法可以让猫去皮,就像猫皮肤一样。
如果您正在寻找一个左侧修剪和一个字符或字符串的右侧修剪,和您的尾随字符/字符串的长度是统一的,这是我的建议:
SELECT SUBSTRING(ColName,VAR, LEN(ColName)-VAR)
或者在这个问题上......
SELECT SUBSTRING('"this is a test message"',2, LEN('"this is a test message"')-2)
这样,您只需将SUBSTRING起点(2)和LEN位置(-2)调整为需要从字符串中删除的任何值。
它是非迭代的,不需要明确的案例测试,最重要的是内联所有这些都可以实现更清晰的执行计划。
答案 3 :(得分:2)
你可以用空字符串替换引号......
SELECT AllRemoved = REPLACE(CAST(MyColumn AS varchar(max)), '"', ''),
LeadingAndTrailingRemoved = CASE
WHEN MyTest like '"%"' THEN SUBSTRING(Mytest, 2, LEN(CAST(MyTest AS nvarchar(max)))-2)
ELSE MyTest
END
FROM MyTable
答案 4 :(得分:2)
您可以在SQL Server中使用“替换”功能。
像这样::select REPLACE('this is a test message','"','')
注意:这里的第二个参数是两个单引号内的“双引号”,第三个参数只是两个单引号的组合。这里的想法是用空格替换双引号。
非常简单易行!
答案 5 :(得分:2)
如果调用表[Messages]并且该列名为[Description],则以下脚本仅从列值周围删除引号。
-- If the content is in the form of "anything" (LIKE '"%"')
-- Then take the whole text without the first and last characters
-- (from the 2nd character and the LEN([Description]) - 2th character)
UPDATE [Messages]
SET [Description] = SUBSTRING([Description], 2, LEN([Description]) - 2)
WHERE [Description] LIKE '"%"'
答案 6 :(得分:2)
我的解决方案是使用列值长度的差异比较相同的列长度,但将双引号替换为空格并进行修剪,以便将起始值和长度值计算为SUBSTRING函数中的参数。
这样做的好处是你可以删除任何前导或尾随字符,即使它多次出现同时留下文本中包含的任何字符。
以下是我对一些测试数据的回答:
SELECT
x AS before
,SUBSTRING(x
,LEN(x) - (LEN(LTRIM(REPLACE(x, '"', ' ')) + '|') - 1) + 1 --start_pos
,LEN(LTRIM(REPLACE(x, '"', ' '))) --length
) AS after
FROM
(
SELECT 'test' AS x UNION ALL
SELECT '"' AS x UNION ALL
SELECT '"test' AS x UNION ALL
SELECT 'test"' AS x UNION ALL
SELECT '"test"' AS x UNION ALL
SELECT '""test' AS x UNION ALL
SELECT 'test""' AS x UNION ALL
SELECT '""test""' AS x UNION ALL
SELECT '"te"st"' AS x UNION ALL
SELECT 'te"st' AS x
) a
产生以下结果:
before after
-----------------
test test
"
"test test
test" test
"test" test
""test test
test"" test
""test"" test
"te"st" te"st
te"st te"st
需要注意的是,当获取长度时我只需要使用LTRIM而不是LTRIM和RTRIM组合,这是因为LEN函数不计算尾随空格。
答案 7 :(得分:2)
一些可重复使用的UDF。
左边按字符修剪(任意数字)
CREATE FUNCTION [dbo].[LTRIMCHAR] (@Input NVARCHAR(max), @TrimChar CHAR(1) = ',')
RETURNS NVARCHAR(max)
AS
BEGIN
RETURN REPLACE(REPLACE(LTRIM(REPLACE(REPLACE(@Input,' ','¦'), @TrimChar, ' ')), ' ', @TrimChar),'¦',' ')
END
按字符缩小(任意数字)
CREATE FUNCTION [dbo].[RTRIMCHAR] (@Input NVARCHAR(max), @TrimChar CHAR(1) = ',')
RETURNS NVARCHAR(max)
AS
BEGIN
RETURN REPLACE(REPLACE(RTRIM(REPLACE(REPLACE(@Input,' ','¦'), @TrimChar, ' ')), ' ', @TrimChar),'¦',' ')
END
请注意,数据中不能出现虚拟字符“|”(Alt + 0166)(您可能希望测试输入字符串,首先,如果不确定或使用其他字符)。
答案 8 :(得分:1)
您可以使用以下对我有用的查询 -
更新 -
UPDATE table SET colName= REPLACE(LTRIM(RTRIM(REPLACE(colName, '"', ''))), '', '"') WHERE...
选择 -
SELECT REPLACE(LTRIM(RTRIM(REPLACE(colName, '"', ''))), '', '"') FROM TableName
答案 9 :(得分:1)
您可以使用TRIM('"' FROM '"this "is" a test"')
来返回:this "is" a test
答案 10 :(得分:0)
你可以试试这个 -
SELECT left(right(cast(SampleText as nVarchar),LEN(cast(sampleText as nVarchar))-1),LEN(cast(sampleText as nVarchar))-2)
FROM TableName
欢呼声
答案 11 :(得分:0)
CREATE FUNCTION dbo.TRIM(@String VARCHAR(MAX), @Char varchar(5))
RETURNS VARCHAR(MAX)
BEGIN
RETURN SUBSTRING(@String,PATINDEX('%[^' + @Char + ' ]%',@String)
,(DATALENGTH(@String)+2 - (PATINDEX('%[^' + @Char + ' ]%'
,REVERSE(@String)) + PATINDEX('%[^' + @Char + ' ]%',@String)
)))
END
GO
Select dbo.TRIM('"this is a test message"','"')
答案 12 :(得分:0)
我用这个:
UPDATE DataImport
SET PRIO =
CASE WHEN LEN(PRIO) < 2
THEN
(CASE PRIO WHEN '""' THEN '' ELSE PRIO END)
ELSE REPLACE(PRIO, '"' + SUBSTRING(PRIO, 2, LEN(PRIO) - 2) + '"',
SUBSTRING(PRIO, 2, LEN(PRIO) - 2))
END
答案 13 :(得分:0)
要删除这两个引号,您可以执行此操作
SUBSTRING(fieldName, 2, lEN(fieldName) - 2)
您可以分配或投影结果值