PDA

Ver la Versión Completa : Buscar una linea completa en un campo blob


glopez
07-02-2011, 18:19:23
Tengo un campo Blob de tipo texto de la siguiente forma
Registro1:
linea1
linea2

Registro 2:
linea3
linea2 || linea4
... || linea2 || ....
linea5
.
.
.
Lo que necesito hacer es una consulta que me devuelva sólo los registros en los que aparece en una línea sola en el campo blob con el texto que busco. Ej: Si busco "linea2" sólo me debe aparecer el registro 1 y no el 2 aunque en la 2ª linea aparezca ese mismo texto pero hay algo más. Por lo que no puedo utilizar sentencias como:


select *
from mitabla
where campo containing 'linea2'

Gracias.

coso
07-02-2011, 19:25:08
hola,
no se si te he entendido bien, pues si buscas linea2 la estas buscando en todos los registros. De todas maneras, si realmente hay diferencia entre las dos 'linea2' que estas buscando, puedes usar algo como



select * from tabla where campo like '%linea2%' and not (campo like '%||linea2||%')



vamos, descartar las 'linea2' que son diferentes. Si no hay diferencia, sinceramente no se como podrias buscarlas. Saludos.

glopez
07-02-2011, 20:47:17
Quizas no me hay explicado bien, lo que intento hacer es buscar que registros contienen una linea de texto en un campo blob pero debe aparecer este texto entero sin nada más en una sóla linea. Aunque este blob puede contener más líneas con otras cosas.

(principio de linea) texto_a buscar (fin de linea)

He probado lo que me planteas pero no funciona.

Gracias

coso
08-02-2011, 00:23:24
vale, ahora te entendi. Si sabes de antemano el valor a buscar, entonces quizas deberias guardar en el campo en cuestion ese valor directamente, sin tener que 'sacarlo' de la tabla en si. Algo asi como



select campo1, campo2, ('texto a buscar' as campo3) from tabla where tabla.campo3 containing 'texto a buscar'



No conozco bien bien el funcionamiento de los alias, por lo que quiza esta sentencia exactamente te de error, pero la idea es esa. Saludos.

glopez
08-02-2011, 10:55:51
La consulta que me envías no puede funcionar ya que en el campo3 de todos los registros siempre tiene el mismo valor "texto a buscar".

coso
08-02-2011, 11:25:19
No, en la consulta que estoy haciendo estoy cogiendo los campos1 y campos2 de la tabla, mientras que creo un alias en campo3 con el valor que directamente buscas (y que es el que quieres). veo que no cogiste la idea. Quizas la sintaxis este mal, pero la idea es esa. Un saludo

coso
08-02-2011, 11:37:48
releyendo el primer post...me da que lo mejor es tal cual te respondi: seleccionar los que tienen 'linea2' y descartar los que tienen 'linea2' y algo mas

guillotmarc
08-02-2011, 12:21:18
Hola

Prueba esto :

select *
from mitabla
where campo containing 'linea2' || ascii_char(13)

Si buscas las lineas con linea2 + un salto de carro, entonces estarás seguro de que no hay nada más a continuación de ella. Por cierto, prueba también con ascii_char(10), ya que nunca estoy seguro de como se implementan los saltos de línea (hay los CR y los LF).

NOTA: Si tu versión de Firebird no reconoce ascii_char() como una función interna, declárala mediante esta sentencia :

DECLARE EXTERNAL FUNCTION ASCII_CHAR
INTEGER
RETURNS CSTRING(1) FREE_IT
ENTRY_POINT 'IB_UDF_ascii_char' MODULE_NAME 'ib_udf';

glopez
08-02-2011, 12:24:19
No te preocupes lo voy a solucionar de otra forma, de todas formas comentarte que no puede funcionar lo que me expones ya que si te fijas en mi primer post en ambos registros aparece "linea2" dentro del mismo campo pero tambien en ambos registros aparece más texto ya sea en la misma linea o en otra y like o containing no pueden distinguir si en el memo esta en una sóla linea o esta junto con mas texto. Al menos que haya alguna forma de pasarle el principio y final de linea.

like /n||'linea2'||/n

De todas formas muchas gracias por tu tiempo.

glopez
08-02-2011, 12:33:16
Gracias guillotmarc, eso es exactamente lo que quería.

coso
08-02-2011, 12:41:43
no nos entendimos desde el principio. La idea era precisamente descartar los que tenian principio i final de linea. Supuse que los representabas con los caracteres ||. En fin, si lo solucionaste, mejor para ti. Un saludo.