![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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. |
#2
|
|||
|
|||
Hola, buenas tardes!
Podrías probar con el siguiente código:
Última edición por lucho6007 fecha: 28-07-2024 a las 23:35:28. Razón: copié y pegué el código y se veía mal :( |
#3
|
||||
|
||||
Cada string tiene que estar entrecomillado.
|
#4
|
|||
|
|||
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. |
#5
|
||||
|
||||
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.
Última edición por duilioisola fecha: 30-07-2024 a las 08:16:50. |
#6
|
|||
|
|||
Estimado GINMARMENOR, en otro post le sugerí este cambio...
Saludos cordiales |
#7
|
|||
|
|||
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. |
#8
|
||||
|
||||
Cita:
La lógica es la siguiente: Código:
SELECT * FROM TABLA WHERE CAMPO IN (COMPARACION_1, COMPARACION_2, COMPARACION_3, ...) 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. |-----------------| 'Garcia', 'Juan', 'Carlos' son 3 strings. |----| |--| |----| +123.45 es un numero positivo con decimales. |-----| -123 45 es un error, puesto que hay u número y luego un espacio seguido de otro número. |--| [ERROR| Última edición por duilioisola fecha: 31-07-2024 a las 08:54:50. |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Dbgrid solo muestra campos tipo INT, campos varchar no los muestra | pollo_c | C++ Builder | 2 | 10-09-2017 21:42:47 |
Sin campos Varchar en el TSQLQery | Chandra_ | Lazarus, FreePascal, Kylix, etc. | 6 | 27-09-2012 23:42:20 |
sumar dos campos varchar | richy08 | MySQL | 5 | 08-01-2008 13:17:39 |
trim en campos varchar | galmacland | SQL | 3 | 12-03-2005 02:40:23 |
Concatenar campos varchar en triggers | Iceman | Firebird e Interbase | 1 | 14-06-2004 21:24:26 |
![]() |
|