![]() |
Operador IN en campos VARCHAR O STRING
Buenas tardes,
Tengo un problema con el operador IN, ya que si me funciona en campos INTEGER, pero no hace lo mismo en campos STRING Ó VARCHAR. Digamos que poniendo un ejemplo sencillo, dispongo de una Tabla llamada INVENTARIO de libros con tres campos: EXIST: integer GENERO: varchar TITULOS: varchar Utilizo la siguiente consulta y me da bien el resultado sin problema, me devuelven Generos que tienen 5,3,8 en existencias.
En cambio si hago lo mismo con el campo GENERO que es tipo VARCHAR
En este caso me da el siguiente error: 'Attemp to execute an unprepared dynamic SQL statement. En caso de que el formato lo cambiara por: TipoGen:='(''Comedia,Drama'')'; el error sería 'Conversion error from string 'Comedia,Drama' En cambio utilizando sólo uno si funciona, pero necesito que sean varios y aleatorios. TipoGen:='(''Comedia'')'; si funciona He intentado varias posibilidades, en internet, en este foro y no distinguen entre campo tipo varchar o tipo Integer. |
Hola, buenas tardes!
Podrías probar con el siguiente código:
|
Cada string tiene que estar entrecomillado.
|
Gracias funcionan los dos códigos aunque me decante por el que no aparece 'Quotedstr', y el código se quedaría como sigue pero leyendo en un Memo y así en modo de ejecución elegir los distintos generos que quiera.
El último TipoGen2, lo año por que la cadena siempre acaba en coma, y así le añado un 0 para que lea un genero que nunca exista y me permita que funcione. NOTA: En este caso el tema de comillas, la verdad que es increíble pero funciona. |
Tres cosas:
1. Las líneas de un memo empiezan con el índice 0. Supongo ue en el FOR empiezas con x := 1 porque la primera es un título. Si no es así, estás perdiendo un elemento. 2. Si no tienes contenido en el Memo, no deberías filtrar... 3. Una forma más elegante (y con menos líneas) es fabricar el SQL en vez de hacerlo en variables para después concatenarlas. (siempre teniendo en cuenta que la primera línea del memo hay que ignorarla como haces en tú ejemplo)
Yo prefiero utilizar WITH..DO para evitar repetir el componente en cada línea.
Y mi preferida, evitando poner un elemento que no existe: 1. Agrego la primera condición, si existe 2. Agrego el resto con una coma delante.
|
Estimado GINMARMENOR, en otro post le sugerí este cambio...
Saludos cordiales |
Lo primero que miré cloayza , fue utilizar tu código ya que se reducía increíblemente
Le di bastantes vueltas pero no había forma por eso abrí otro hilo. La diferencia está en que cuando me lo sugeriste estábamos trabajando con un campo INTEGER (buscando años), pero ahora necesitaba buscar en un campo VARCHAR (STRING), y hay que colocar comillas entre cada texto que se busca y hay que tener cuidado en colocarlas ya que son bastantes no basta con una comilla al principio y otra al final, por eso en campos VARCHAR no funciona, a no se que haya otra fórmula parecida. Duilioisola, aún no he pillado la lógica de las camillas, pero funciona. |
Cita:
La lógica es la siguiente: Código:
SELECT * FROM TABLA En un SQL si quieres poner un número, lo agregas y ya está. SQL entiende que mientras vea números, el punto y el signo "+" o "-" debe interpretarlo como número, hasta que encuentre un separador (espacio, ";" indicando final de línea, ")" indicando final de función, etc.) Si es un texto, debes entrecomillarlo para indicar donde empieza y donde termina el texto. SQL sabrá que hasta que no encuentre otra comilla, todos esos caracteres forman parte de un mismo string. Por ejemplo: Código:
'Garcia, Juan Carlos' es un string. |
ok, gracias,
|
La franja horaria es GMT +2. Ahora son las 11:15:35. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi