2009-06-30 115 views
28

我有一個NTEXT列SQL Server數據庫中的表。此列可能包含用雙引號括起來的數據。當我查詢這一列時,我想刪除這些前導和尾隨引號。如何刪除SQL Server中的前導和尾隨引號?

例如:

「這是一封測試郵件」

應該成爲

這是一封測試郵件

我知道的LTRIM和RTRIM函數,但這些工作只適用於空間。任何關於我可以用來實現這個功能的建議。

+0

您使用的是哪個版本的SQL Server? – 2009-06-30 21:31:41

+0

SQL Server 2005 – adeel825 2009-06-30 23:42:36

回答

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 
+0

在字符串內可能有引號,我不想刪除這些 - 只是引導和尾隨引號。 – adeel825 2009-06-30 21:24:19

+0

更新了一個case語句的例子,當兩者都存在時刪除前導和尾隨。 – 2009-06-30 21:29:47

48

我剛剛測試此代碼在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) = '"' 
+0

這是正確的,你也可以使用LEFT和RIGHT funcions。 – tekBlues 2009-06-30 21:28:53

+1

ntext列,所以LEN,LEFT&RIGHT將不起作用。您應該改爲DataLength和SubString。 – 2009-06-30 21:29:48

+0

SUBSTRING是SQL Server中的功能。不是SUBSTR – Keltex 2010-09-11 18:30:23

0

你可以試試這個 -

SELECT left(right(cast(SampleText as nVarchar),LEN(cast(sampleText as nVarchar))-1),LEN(cast(sampleText as nVarchar))-2) 
    FROM TableName 

歡呼聲

18

我認爲這是一個簡單的腳本,如果你想刪除所有報價

UPDATE Table_Name 
SET col_name = REPLACE(col_name, '"', '') 
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),以你需要從字符串中刪除任何值。

這是非迭代的,不需要明確的案例測試,最重要的是它是內聯所有這些都是一個更清晰的執行計劃。

2

您可以簡單地使用SQL Server中的 「替換」 功能。

這樣的:

select REPLACE('this is a test message','"','') 

注:第二個參數這裏是「雙引號」兩個單引號內,第三個參數是簡單的兩個單引號的組合。這裏的想法是用空白替換雙引號。

非常簡單和易於執行!

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 '"%"' 
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函數不計算尾隨空格。

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 
0

要刪除這兩個報價,你可以做到這一點

SUBSTRING(fieldName, 2, lEN(fieldName) - 2) 

您可以分配或項目所產生的價值

0

您可以使用哪些工作下面的查詢對我來說 -

For updating-

UPDATE table SET colName= REPLACE(LTRIM(RTRIM(REPLACE(colName, '"', ''))), '', '"') WHERE... 

對於selecting-

SELECT REPLACE(LTRIM(RTRIM(REPLACE(colName, '"', ''))), '', '"') FROM TableName 
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)不能出現在數據(您可能希望測試您的輸入字符串,首先,如果不確定或使用不同的字符)。

相關問題