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.
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) = '"'
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, '"', '')
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.
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).
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 '"%"'
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.
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!
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
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
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
Pour supprimer les deux guillemets, vous pouvez le faire.
SUBSTRING(fieldName, 2, lEN(fieldName) - 2)
vous pouvez assigner ou projeter la valeur résultante
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"','"')
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é