Tengo una tabla SQL como esta:
| SomeID | OtherID | Data
+----------------+-------------+-------------------
| abcdef-..... | cdef123-... | 18,20,22
| abcdef-..... | 4554a24-... | 17,19
| 987654-..... | 12324a2-... | 13,19,20
¿Hay una consulta donde pueda realizar una consulta como SELECT OtherID, SplitData WHERE SomeID = 'abcdef-.......'
esa que devuelve filas individuales, como esta:
| OtherID | SplitData
+-------------+-------------------
| cdef123-... | 18
| cdef123-... | 20
| cdef123-... | 22
| 4554a24-... | 17
| 4554a24-... | 19
¿Básicamente dividir mis datos en la coma en filas individuales?
Soy consciente de que almacenar una comma-separated
cadena en una base de datos relacional suena tonto, pero el caso de uso normal en la aplicación del consumidor lo hace realmente útil.
No quiero hacer la división en la aplicación, ya que necesito paginación, por lo que quería explorar las opciones antes de refactorizar toda la aplicación.
Es SQL Server 2008
(no R2).
sql-server
tsql
split
comma
Michael Stum
fuente
fuente
Respuestas:
Puede usar las maravillosas funciones recursivas de SQL Server:
Tabla de muestra:
La consulta
Salida
fuente
Data
devarchar(max)
avarchar(4000)
, pcreate table Testdata(SomeID int, OtherID int, Data varchar(4000))
. Ej .OPTION (maxrecursion 0)
Finalmente, la espera ha terminado con SQL Server 2016 . Han introducido la función Split string
STRING_SPLIT
:Todos los otros métodos para dividir cadenas como XML, tabla Tally, while loop, etc. han quedado asombrados por esta
STRING_SPLIT
función.Aquí hay un excelente artículo con comparación de rendimiento: Sorpresas y supuestos de rendimiento: STRING_SPLIT .
Para versiones anteriores, el uso de la tabla de conteo aquí es una función de cadena dividida (el mejor enfoque posible)
Referido de Tally OH! Una función mejorada de SQL 8K "CSV Splitter"
fuente
value
, noSplitData
.Mira esto
fuente
fuente
CROSS APPLY
, ¡es un poco útil!select t.OtherID, x.* from testData t cross apply (select item as Data from dbo.Split(t.Data,',') ) x
A partir de febrero de 2016, vea el ejemplo de la tabla TALLY: es muy probable que supere mi TVF a continuación, a partir de febrero de 2014. Mantener la publicación original a continuación para la posteridad:
Demasiado código repetido para mi gusto en los ejemplos anteriores. Y no me gusta el rendimiento de CTE y XML. Además, un explícito
Id
para que los consumidores que son específicos del pedido puedan especificar unaORDER BY
cláusula.fuente
Es bueno ver que se ha resuelto en la versión 2016, pero para todos los que no están en eso, aquí hay dos versiones generalizadas y simplificadas de los métodos anteriores.
El método XML es más corto, pero, por supuesto, requiere la cadena para permitir el truco xml (sin caracteres 'malos').
Método XML:
Método recursivo:
Función en acción
XML-METHOD 2: Unicode Friendly 😀 (Además cortesía de Max Hodges)
create function dbo.splitString(@input nVarchar(max), @Splitter nVarchar(99)) returns table as Return SELECT Split.a.value('.', 'NVARCHAR(max)') AS Data FROM ( SELECT CAST ('<M>' + REPLACE(@input, @Splitter, '</M><M>') + '</M>' AS XML) AS Data ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a);
fuente
Consulte a continuación TSQL. La función STRING_SPLIT solo está disponible bajo el nivel de compatibilidad 130 y superior.
TSQL:
RESULTADO:
Color
rojo azul verde amarillo negro
fuente
Muy tarde pero prueba esto:
Entonces estábamos teniendo esto: tbl_Sample:
Después de ejecutar esta consulta:
¡Gracias!
fuente
STRING_SPLIT
es ingenioso pero requiere SQL Server 2016. docs.microsoft.com/en-us/sql/t-sql/functions/…fuente
con solo una pequeña modificación a la consulta anterior ...
fuente
Siempre uso el método XML. Asegúrese de usar XML VÁLIDO. Tengo dos funciones para convertir entre XML válido y texto. (Tiendo a eliminar los retornos de carro ya que generalmente no los necesito.
fuente
SELECT (SELECT '<&> blah' + CHAR(13)+CHAR(10) + 'next line' FOR XML PATH(''))
Función
Caso de uso
O simplemente una selección con múltiples resultados
fuente
A continuación funciona en SQL Server 2008
Obtendrá todos los productos cartesianos con las columnas de la tabla de origen más los "elementos" de la tabla dividida.
fuente
Puede usar la siguiente función para extraer datos
fuente