J'ai une chaîne comme: et je le veux comme des rangées comme: p> dans la requête MSSQL. P > p>
4 Réponses :
Eh bien, vous pouvez utiliser un syndicat ou créer une table et insérer ces données là-bas.
Union exemple p> et ainsi de suite. p> @edit : P> comprise, basée sur un commentaire, vous pouvez jeter un coup d'œil sur la réponse ici:
https://stackoverflow.com/a/5493616/8416043 p> Je ne le multiplierai pas ici . p> bonne chance p> p>
Je ne suis pas sûr que cela fonctionnera pour cela, son exigence est complexe avec les données qu'il a. Il veut une chaîne dans MySQL d'être écartée où on peut utiliser Substring_index, mais il souhaite à nouveau exclure des virgules qui apparaissent dans le support
Merci pour la réponse, mais je veux demander que puis-je séparer «A», 'B' et 'C (A, B, C) ». Pour la requête de l'Union.
IF OBJECT_ID('tempdb..#Data')IS NOT NULL
DROP TABLE #Data
CREATE TABLE #Data
(
ID INT IDENTITY(1,1),
String VARCHAR(MAX)
)
INSERT #Data SELECT 'a,b,c(a,b,c),d,e,L(e,d,g)'
UPDATE T SET String=REPLACE(REPLACE(String,'(','('''),')',''')') FROM #Data T
IF OBJECT_ID('tempdb..#T')IS NOT NULL
DROP TABLE #T
DECLARE @FieldSeparator VARCHAR(10)='(',@FieldSeparator1 VARCHAR(10)=')'
;WITH CTE AS
(
SELECT
ID,
LEFT(String, CHARINDEX(@FieldSeparator, String + @FieldSeparator) - 1) DataItem,
STUFF(String, 1, CHARINDEX(@FieldSeparator, String + @FieldSeparator), '') String
FROM #Data
UNION all
SELECT
ID,
LEFT(String, CHARINDEX(@FieldSeparator, String + @FieldSeparator) - 1),
STUFF(String, 1, CHARINDEX(@FieldSeparator, String + @FieldSeparator), '')
FROM CTE
WHERE String > ''
)
SELECT
ID,
DataItem AS String
INTO #T
FROM CTE WHERE CHARINDEX(@FieldSeparator1,DataItem)>0
ORDER BY ID
--SELECT * FROM #T
IF OBJECT_ID('tempdb..#T1')IS NOT NULL
DROP TABLE #T1
;WITH CTE AS
(
SELECT
ID,
LEFT(String, CHARINDEX(@FieldSeparator1, String + @FieldSeparator1) - 1) DataItem,
STUFF(String, 1, CHARINDEX(@FieldSeparator1, String + @FieldSeparator1), '') String
FROM #T
UNION ALL
SELECT
ID,
LEFT(String, CHARINDEX(@FieldSeparator1, String + @FieldSeparator1) - 1),
STUFF(String, 1, CHARINDEX(@FieldSeparator1, String + @FieldSeparator1), '')
FROM CTE
WHERE String > ''
)
SELECT
ID,
DataItem,
DataItem NewString
INTO #T1
FROM CTE WHERE CHARINDEX('''',DataItem)>0
ORDER BY ID
--SELECT * FROM #T1
UPDATE #T1 SET NewString=REPLACE(REPLACE(NewString,',','|'),'''','')
UPDATE #T1 SET DataItem='('+DataItem+')',NewString='('+NewString+')'
ALTER TABLE #T1 ADD Rn INT
UPDATE A SET A.Rn=Rn1 FROM
(
SELECT *,ROW_NUMBER()OVER(ORDER BY ID ASC)Rn1 FROM #T1
)A
DECLARE @Start INT =1,@End INT=(SELECT MAX(Rn) FROM #T1),@Str VARCHAR(1000),@Id INT
WHILE @Start<=@End
BEGIN
UPDATE T SET T.String=REPLACE(T.String,T1.DataItem,T1.NewString) FROM #Data T
INNER JOIN #T1 T1 ON T.ID=T1.Id AND T1.Rn=@Start
SET @Start=@Start+1
END
--SELECT * FROM #Data
DECLARE @FieldSeparator2 VARCHAR(10)=','
;WITH CTE AS
(
SELECT
ID,
LEFT(String, CHARINDEX(@FieldSeparator2, String + @FieldSeparator2) - 1) DataItem,
STUFF(String, 1, CHARINDEX(@FieldSeparator2, String + @FieldSeparator2), '') String
FROM #Data
UNION all
SELECT
ID,
LEFT(String, CHARINDEX(@FieldSeparator2, String + @FieldSeparator2) - 1),
STUFF(String, 1, CHARINDEX(@FieldSeparator2, String + @FieldSeparator2), '')
FROM CTE
WHERE String > ''
)
SELECT
ID,
REPLACE(REPLACE(DataItem,'|',','),'''','') AS String
FROM CTE
ORDER BY ID
Quelque chose est possible avec suffisamment d'effort créatif, mais SQL Server n'est vraiment pas le lieu de faire de la manipulation de texte complexe: Ceci fonctionne en morphing la chaîne en XML, en utilisant un déchiquetage XML qui fonctionne simplement contre les virgules non imbriquées (transformées), puis défaillant la XML-IFICATION pour restaurer à l'original. P> Je l'ai fait comme deux étapes distinctes afin que vous puissiez voir le Étapes intermédiaires de la XML-IFICATION SI VOUS VOULEZ. P> P>
Très belle et innovante, mais si les données contiennent de l'espace, par exemple 'A, B , C (AD, B, C), R ,', il ne fonctionne pas, il ne fonctionne pas simplement, il vous suffit d'ajouter une autre remplacement comme ci-dessous Sélectionnez Remplacer (remplacer (Remplacer (remplacer (remplacer (remplacer (remplacer (convert (varc har (max), x.Query ('.')), ' ', ','), ' '', '('), ' b>', ')') '),' '', ''), '' ',' ') , '', '') de (sélectionnez Convertir (XML, @ Inter2)) T (ABC) Cross Appliquer ABC.NODES ('/ C / A') U (X)
Utilisez la fonction ci-dessous pour obtenir la liste des lignes. Il aidera
Merci pour la réponse mais la fonction ne donne pas le résultat correct, cela donne comme: - Si je passe une corde comme: - 'A, B, C (A, B, C), B, N (B, A, D)' Résultat As: 1. A 2. B 3. C (A 4. B 5. C) 6. B 7. N (B 8. A 9. D)
Je vérifierai et partagerai la requête pour ce que vous êtes attendu.
Pouvez-vous nous dire pourquoi voulez-vous faire cela à l'aide de la requête MySQL et que vous voulez la réponse en tant que ligne. Si vous pouvez extraire des données, nous pouvons utiliser REGEX dans n'importe quel langage de programmation comme PHP ou pour obtenir cette sortie souhaitée. Faites-nous savoir l'obligation de pouvoir suggérer une meilleure solution.