web-dev-qa-db-fra.com

Comment puis-je supprimer les guillemets en début et en fin dans SQL Server?

J'ai une table dans une base de données SQL Server avec une colonne NTEXT. Cette colonne peut contenir des données entre guillemets. Lorsque je lance une requête pour cette colonne, je souhaite supprimer ces guillemets en début et en fin. 

Par exemple:

"Ceci est un message test"

devraient devenir

Ceci est un message test

Je connais les fonctions LTRIM et RTRIM, mais celles-ci ne fonctionnent que pour les espaces. Toutes les suggestions sur les fonctions que je peux utiliser pour y parvenir.

29
adeel825

Je viens de tester ce code dans MS SQL 2008 et de le valider.

Supprimer la citation la plus à gauche:

UPDATE MyTable
SET FieldName = SUBSTRING(FieldName, 2, LEN(FieldName))
WHERE LEFT(FieldName, 1) = '"'

Supprimer la citation la plus à droite: (révisée pour éviter les erreurs de conversion de type implicite en int)

UPDATE MyTable
SET FieldName = SUBSTRING(FieldName, 1, LEN(FieldName)-1)
WHERE RIGHT(FieldName, 1) = '"'
51
WowtaH

Je pensais que c'était un script plus simple si vous voulez supprimer toutes les citations

UPDATE Table_Name
SET col_name = REPLACE(col_name, '"', '')
23
Mark O'Grady

Je sais que ceci est une publication de question plus ancienne, mais ma fille est venue me voir avec la question et a mentionné cette page comme ayant des réponses possibles. Etant donné qu'elle cherche une solution à ce problème, il est prudent de penser que d'autres pourraient l'être également.

Ce sont toutes d'excellentes approches et, comme pour tout, il y a à peu près autant de façons de peler un chat qu'il y a de chats à peau.

Si vous recherchez un ajustement gauche et un ajustement droit d'un caractère ou d'une chaîne, et votre caractère/chaîne de fin est de longueur uniforme, voici ma suggestion:

SELECT SUBSTRING(ColName,VAR, LEN(ColName)-VAR)

Ou dans cette question ...

SELECT SUBSTRING('"this is a test message"',2, LEN('"this is a test message"')-2)

Avec cela, vous ajustez simplement le point de départ SUBSTRING (2) et la position LEN (-2) à la valeur que vous devez supprimer de votre chaîne. 

Il est non-itératif et ne nécessite pas de tests de cas explicites. Il s’agit avant tout de inline qui constituent un plan d’exécution plus clair.

3
user2043286

Quelques UDF pour la réutilisation.

Découpage à gauche par caractère (n'importe quel nombre)

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

Découpe à droite par caractère (n'importe quel nombre)

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

Notez que le caractère factice '¦' (Alt + 0166) ne peut pas être présent dans les données (vous voudrez peut-être tester votre chaîne d'entrée en premier, en cas de doute ou utiliser un autre caractère).

2
DaveN

Le script suivant supprime les guillemets uniquement autour de la valeur de la colonne si table s'appelle [Messages] et que la colonne s'appelle [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
Germstorm

Ma solution consiste à utiliser la différence entre la longueur des valeurs de colonne et la même longueur de colonne, mais les guillemets doubles sont remplacés par des espaces et ajustés afin de calculer les valeurs de début et de longueur en tant que paramètres d'une fonction SUBSTRING. 

L'avantage de procéder de cette façon est que vous pouvez supprimer n'importe quel caractère de début ou de fin, même s'il se produit plusieurs fois tout en laissant tous les caractères contenus dans le texte.

Voici ma réponse avec quelques données de test:

 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

Ce qui produit les résultats suivants:

before  after
-----------------
test    test
"   
"test   test
test"   test
"test"  test
""test  test
test""  test
""test""    test
"te"st" te"st
te"st   te"st

Une chose à noter que pour obtenir la longueur, je n'ai besoin que d'utiliser LTRIM et non LTRIM et RTRIM combinés, car la fonction LEN ne compte pas les espaces de fin.

2
Dave Sexton

Vous pouvez simplement utiliser la fonction "Remplacer" dans SQL Server.

comme ça ::

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

remarque: le deuxième paramètre est "guillemets doubles" à l'intérieur de deux guillemets simples et le troisième paramètre est simplement une combinaison de deux guillemets simples. L'idée ici est de remplacer les guillemets doubles par un blanc.

Très simple et facile à exécuter!

2
Deadman

vous pouvez remplacer les guillemets par une chaîne vide ...

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
2
Scott Ivey

Vous pouvez utiliser la requête suivante qui a fonctionné pour moi 

Pour la mise à jour

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

Pour la sélection

SELECT REPLACE(LTRIM(RTRIM(REPLACE(colName, '"', ''))), '', '"') FROM TableName
1
ShaileshDev

J'utilise ceci:

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
Hugo

Pour supprimer les deux guillemets, vous pouvez le faire. 

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

vous pouvez assigner ou projeter la valeur résultante

0
Luiso
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"','"')

Référence: http://raresql.com/2013/05/20/sql-server-trim-how-to-remove-leading-and-trailing-characters-pace-from-string/

0
user1059637

Vous pouvez essayer ceci-

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

à votre santé

0
Arnkrishn