Pregunta

Puede/Debería utilizar COMO criterios, como parte de una combinación INTERNA cuando la creación de un procedimiento almacenado/consulta?No estoy seguro de que me estoy haciendo lo correcto, así que permítanme explicar.

Estoy creando un procedimiento que va a tener una lista de palabras clave a buscar en una columna que contiene el texto.Si yo estaba sentado en la consola, me gustaría ejecutar como tal:

SELECT Id, Name, Description
  FROM dbo.Card
 WHERE Description LIKE '%warrior%' 
       OR
       Description LIKE '%fiend%' 
       OR 
       Description LIKE '%damage%'

Pero un truco que se me cogió un poco de tiempo ir a hacer "inflexible" lista de análisis en un procedimiento almacenado es analizar la lista en una variable de tabla/tabla temporal, la conversión al tipo adecuado y, a continuación, hacer un INNER JOIN en contra de esa tabla en mi último conjunto de resultados.Esto funciona muy bien cuando el envío de decir una lista de Identificadores de enteros para el procedimiento.Yo de viento de hasta la última consulta que se parece a esto:

SELECT Id, Name, Description
  FROM dbo.Card
       INNER JOIN @tblExclusiveCard ON dbo.Card.Id = @tblExclusiveCard.CardId

Quiero usar este truco con una lista de cadenas.Pero ya que estoy buscando una palabra clave en particular, voy a usar la cláusula LIKE.Idealmente, estoy pensando en que me gustaría tener mi última consulta en este aspecto:

SELECT Id, Name, Description
  FROM dbo.Card
       INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + @tblKeyword.Value + '%'

Es esto posible/recomendable?

Hay una manera mejor de hacer algo como esto?


La razón por la que estoy poniendo comodines en ambos extremos de la cláusula es porque hay "archidemonio", "bestia-guerrero", "daño directo" y "la batalla de daño" términos que se utilizan en la tarjeta de textos.

Estoy recibiendo la impresión de que en función del rendimiento, me puede utilizar la consulta especificada o uso de un texto completo de búsqueda de palabra clave para realizar la misma tarea?

Aparte de tener el servidor hacer un índice de texto en los campos que desea en la búsqueda de texto, ¿hay algo más que deba hacer?

¿Fue útil?

Solución

Su primera consulta se va a trabajar, pero se requiere un análisis completo de la tabla, ya que cualquier índice en esa columna será ignorado.Usted también tendrá que hacer algunos SQL dinámico para generar toda tu COMO cláusulas.

Intente una búsqueda de texto completo si el uso de SQL Server o echa un vistazo a uno de los Lucene implementaciones.Joel habló acerca de su éxito con él recientemente.

Otros consejos

Intente esto

    select * from Table_1 a
    left join Table_2 b on b.type LIKE '%' + a.type + '%'

Esta práctica no es lo ideal.Usar con precaución.

Parece que usted está buscando para la búsqueda de texto completo.Porque desea consultar un conjunto de palabras clave en contra de la descripción de la tarjeta y encontrar cualquier hits?La correcta?

Personalmente, lo he hecho antes, y ha funcionado bien para mí.Las únicas cuestiones que pude ver es posiblemente problemas con un no indexada en la columna, pero creo que tendría el mismo problema con una cláusula where.

Mi consejo para usted es simplemente mirar a los planes de ejecución entre los dos.Estoy seguro de que será diferente que es mejor dependiendo de la situación, así como todas las buenas problemas de programación.

@Dillie-O
Cómo de grande es este cuadro?
¿Cuál es el tipo de datos de campo de la Descripción?

Si bien son pequeños una búsqueda de texto completo será una exageración.

@Dillie-O
Tal vez no es la respuesta que buscabas, pero yo estaría a favor de un cambio de esquema...

propuesta de esquema:

create table name(
    nameID identity / int
   ,name varchar(50))

create table description(
    descID identity / int
   ,desc varchar(50)) --something reasonable and to make the most of it alwase lower case your values

create table nameDescJunc(
    nameID  int
    ,descID int)

Esto le permitirá usar el índice sin tener que implementar un perno en solución, y mantiene sus datos atómica.

relacionado con: Se recomienda SQL de la base de datos de diseño para etiquetas o etiquetas

un truco que se me cogió un poco de tiempo ir para hacer "inflexible" lista de análisis en un procedimiento almacenado es analizar la lista en una variable de tabla/temporal tabla

Creo que lo que usted podría estar aludiendo a aquí es poner las palabras clave para incluir en una tabla, a continuación, utilizar relacional de la división de para encontrar coincidencias (también podría usar otra tabla para las palabras excluir).Para un ejemplo práctico de SQL ver Las Búsquedas de palabras clave por Joe Celko.

intente...

select * from table11 a inner join  table2 b on b.id like (select '%'+a.id+'%') where a.city='abc'.

Su funciona para mí.:-)

El rendimiento será depende del servidor que utiliza, y en el esquema de los datos, y la cantidad de datos.Con las actuales versiones de MS SQL Server, que la consulta debe ejecutar bien (MS SQL Server 7.0 tenido problemas con la sintaxis, pero esto se abordó en el SP2).

Han de ejecutar ese código a través de un analizador?Si el rendimiento es lo suficientemente rápido y los datos de los índices adecuados en su lugar, usted debe estar todo listo.

LIKE '%fiend%' nunca va a usar un buscar, COMO 'el demonio%' voluntad.Simplemente una búsqueda de comodín no es sargable

Intente esto;

SELECT Id, Name, Description
FROM dbo.Card
INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + 
                                CONCAT(CONCAT('%',@tblKeyword.Value),'%') + '%'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top