¿Cómo puedo encontrar todas las posiciones patindex
en una tabla o variable?
declare @name nvarchar(max)
set @name ='ali reza dar yek shabe barani ba yek '
+ 'dokhtare khoshkel be disco raft va ali baraye'
+ ' 1 saat anja bud va sepas... ali...'
select patindex('%ali%',@name) as pos
Esto vuelve 1
pero quiero todos los resultados, por ejemplo:
pos
===
1
74
113
sql-server
sql-server-2005
string-searching
coditori
fuente
fuente
1
en una cadena que contiene solo ceros y unos. He usado Su solución y @ aaron-bertrand, pero obtuve los mismos resultados y el mismo rendimiento. ¿Qué solución sería mejor?Creo que esto será un poco más eficiente que el método de bucle que ha elegido ( alguna evidencia aquí ), y definitivamente más eficiente que el CTE recursivo:
Uso de la muestra:
Resultados:
Si sus cadenas serán más largas que 2K, use sys.all_columns en lugar de sys.all_objects. Si tiene más de 8K, agregue una unión cruzada.
fuente
- CTE recursivo
fuente
Me encanta la respuesta de Aaron Bertrand. Aunque no lo entiendo completamente, se ve muy elegante.
En el pasado me he encontrado con problemas con los permisos al usar
sys.objects
. Combinado con la necesidad de solucionar el código, se me ocurrió una variación del código de Aaron y lo agregué a continuación.Este es mi procedimiento:
El
MAX(posid)
valor también es el número de coincidencias encontradas.fuente
Este es un código simple basado en la respuesta de Aaron que:
CÓDIGO:
RESULTADO
fuente
sys.all_columns
(puede usar cualquier fuente siempre que cubra la longitud de su cadena más larga), y también lo he vuelto a probar y no veo dónde extraño la última 'X'. .Perdón por venir tan tarde, pero me gustaría hacer las cosas más fáciles para las personas que quieren expandirse en esto. Estaba mirando cada una de estas implementaciones, tomé la que me pareció mejor (Aaron Bertrand), la simplifiqué y aquí tienes, tienes la "plantilla". Úsalo con sabiduría.
Solo como referencia: puede derivar otros comportamientos de esto, como expandir en PATINDEX ():
fuente
fuente