Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Duda con una comparacion...

Estas en el tema de Duda con una comparacion... en el foro de SQL Server en Foros del Web. Tengo una duda con respecto poner condiciones de la sigueinte manera : SELECT * FROM TABLA_X WHERE CAMPO_A<>'01/0122' SELECT * FROM TABLA_X WHERE CAMPO_A<='01/0122' SELECT ...
  #1 (permalink)  
Antiguo 04/02/2009, 12:58
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 19 años, 3 meses
Puntos: 3
Pregunta Duda con una comparacion...

Tengo una duda con respecto poner condiciones de la sigueinte manera :

SELECT * FROM TABLA_X WHERE CAMPO_A<>'01/0122'
SELECT * FROM TABLA_X WHERE CAMPO_A<='01/0122'
SELECT * FROM TABLA_X WHERE CAMPO_A>='01/0122'
SELECT * FROM TABLA_X WHERE CAMPO_A>'01/0122'
SELECT * FROM TABLA_X WHERE CAMPO_A<'01/0122'

En este caso el CAMPO_A es de tipo varchar, si utilizo esas comparaciones si me devuelve valores, pero no entiendo bien que ocurre, como es que puedo indicarle a un campo varchar que en la condicion me cumpla que el campo sea mayo, menor, etc a una cadena? si alguien me puede ayudar con esta duda se lo agreadecere mucho!!
__________________
Wow! No se que decir...

Última edición por zyon; 04/02/2009 a las 13:15
  #2 (permalink)  
Antiguo 04/02/2009, 13:25
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 17 años
Puntos: 260
Sonrisa Respuesta: Dura con comparacion...

Hola,

Internamente SQLServer le asigna un número a cada letra, dependiendo del lenguaje. Después hace comparaciones númericas para saber si una letra es mayor que otra en base a una tabla (especifica del 'character set').

ASCII

A = 65
Z = 90

La letra Z es mayor que la letra A.
Irónicamente la letra '2' (número 2 en decimal) se convierte en 49 (o 50?).
Y también se diferencian las minúsculas.

¿Donde está la Ñ?
Dependiendo del lenguaje puede ser mayor que la Z o estar después de la N.

Español: [ JKLMNÑOPQ ... ]
ASCII Normal : [ JKLMNOPQ ... Ñ ]

Saludos,

ps:
Claramente no puedes compara 'letras' con 'numeros'. Solamente en algunos casos donde exista conversión implícita, pero da muchos problemas. SQL internamente ha de ser mucho más complejo, esta es una simple explicación básica.

Última edición por HackmanC; 04/02/2009 a las 13:33 Razón: la letra '2' (cambie el 1 por que parecía ele).
  #3 (permalink)  
Antiguo 04/02/2009, 13:30
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 19 años, 3 meses
Puntos: 3
Respuesta: Duda con una comparacion...

wow! no lo sabia, mm pero en el ejemplo que doy se compara una cadenas '01/0122', e este caso que pasa? los numeros tambien tienen un valor como las letras? o cada nuemro es sumado al valor numerico del '/' dando en realidad una sola suma?
__________________
Wow! No se que decir...
  #4 (permalink)  
Antiguo 04/02/2009, 13:38
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 19 años, 4 meses
Puntos: 39
Respuesta: Duda con una comparacion...

En el caso de cadenas, la comparacion se hace a nivel de los valores ASCII.
Si no me equivoco la comparacion se hace solo con respecto al primer caracter de cada cadena.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #5 (permalink)  
Antiguo 04/02/2009, 13:43
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 17 años
Puntos: 260
Sonrisa Respuesta: Duda con una comparacion...

Hola,

'01/0122'

Cada símbolo tiene un número:

0 = 48
1 = 49
/ = 47
0 = 48
1 = 49
2 = 50
2 = 50

La comparación se hace caracter a caracter sobre toda la cadena. No es una suma. ASCII se usa solamente si ese fue el 'character set' que seleccionaste. Pero puede ser Iso, utf, spanish-internacional, etc.

'01/0122'
'01/012A' <= esta cadena es mayor -- por que la 'A' es mayor que '2'

Saludos,

ps:
Normalmente se usa el 'character set' como el conjunto de caracteres que maneja el programa, y el 'collation' como el ordenamiento. Es bastante complejo, pero se simplifica el concepto al pensar en la tabla ASCII donde cada símbolo tiene un número.

Última edición por HackmanC; 04/02/2009 a las 13:57 Razón: agregar el /
  #6 (permalink)  
Antiguo 04/02/2009, 13:59
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 19 años, 3 meses
Puntos: 3
Respuesta: Duda con una comparacion...

haciendo esta comparacion:

SELECT * FROM TABLA_X WHERE CAMPO_A<='01/0122'

me debuelve 233 filas de poco mas de tres mil, la mayoria de las filas en el CAMPO_A el valor esta vacio (no NULL ni con espacio), y solo en algunos me mando valores como :

'0051 2DO. TRIB. COL.' , 'STP/0341/2009' , 'STP/0407/2009-I' ó ''

Significa que el valor de DOS en '01/0122' es menor a la letra o numero al final de cada valor que les mostre arriba o que inclusive el espacio en blanco?
__________________
Wow! No se que decir...
  #7 (permalink)  
Antiguo 04/02/2009, 14:56
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 17 años
Puntos: 260
Sonrisa Respuesta: Duda con una comparacion...

Hola,

El ejemplo mostrado en ASCII es solamente para facilitar un poco la compresión de como ordena y compara la base de datos entre los diferentes símbolos que puede tener.

Según el resultado que muestras 'SPT...' es menor que '01/' en la tabla de caracteres y tu ordenamiento de lenguaje. En 'Modern_Spanish' que es mi configuración en toda mi base de datos, 'SPT...' es mayor que '01/' (y por consiguiente no aparece).

El problema puede ser que estés usando un idioma en el cual realmente así deba ser, o que mezclaste a la base de datos con un collation ó las tablas y campos con otro, o tu conexión con otro. (Para saberlo habría que investigar cada uno de los detalles de tu configuración, y ese es otro tema).

Para averiguar cual va a ser el orden, inserta el registro en la base de datos con el valor '01/...' y usa una consulta con ORDER BY (sin el WHERE) y mira los resultados obtenidos; ese es el ordenamiento que va a tener especificado en la tabla. (Todo lo que esté arriba es menor y lo que esté abajo es mayor).

Saludos,
  #8 (permalink)  
Antiguo 04/02/2009, 15:18
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 19 años, 3 meses
Puntos: 3
Respuesta: Duda con una comparacion...

a ok, entonces solo me quedaria la duda de si cuando un campo esta en blanco, tambien tiene un valor como si fuera una letra... hay alguna pagina que tenga la referencia de este tema? o como podria buscarlo?
__________________
Wow! No se que decir...
  #9 (permalink)  
Antiguo 04/02/2009, 17:29
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 17 años
Puntos: 260
Sonrisa Respuesta: Duda con una comparacion...

Hola,

Depende de que versión de MSSQL estés usando. Aunque creo que la mejor referencia es la misma ayuda que trae el programa. Ó MSDN en Microsoft las palabras clave Collation, SQL International, Modern_Spanish, etc.

http://msdn.microsoft.com/en-us/libr...4(SQL.80).aspx

Saludos,

ps:
El espacio si tiene un código establecido, pero puede variar dependiendo de la codificación.
El valor null no tiene código 'normalmente', y el valor 'vacío' donde no hay 'nada' es 'nada'.

Última edición por HackmanC; 04/02/2009 a las 17:36
  #10 (permalink)  
Antiguo 04/02/2009, 19:34
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 19 años, 3 meses
Puntos: 3
Respuesta: Duda con una comparacion...

vale, muchas gracias por su ayuda y comentarios, me sirbio mucho enserio, gracias de nuevo!!!
__________________
Wow! No se que decir...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:04.