Como en la conversión de consultas SQL. Conversión de tipo implícita. Operadores aritméticos SQL básicos

Las implementaciones del lenguaje SQL pueden realizar conversiones de tipos implícitas. Entonces, por ejemplo, en T-SQL al comparar o combinar valores de tipos pequeño Y En t, tipo de datos pequeño se convierten implícitamente en tipo En t. Detalles sobre la conversión de tipos explícita e implícita en MS servidor SQL se puede leer en BOL.

Ejemplo. Muestra el precio medio de los blocs de notas para PC con el texto anterior "precio medio = ".
Intentando completar una solicitud


Como resultado, obtenemos lo que necesitábamos:

dará el resultado 1926. En principio, todo es correcto, porque Como resultado, obtuvimos lo que pedimos: UN AÑO. Sin embargo, la media aritmética será aproximadamente 1926,2381. Cabe señalar aquí que Funciones agregadas(excepto la función CONTAR, que siempre devuelve un número entero) heredan el tipo de datos de los valores procesados. Dado que el campo lanzado es un número entero, obtuvimos el valor promedio con descartado parte fraccional(nota: no redondeado).
¿Qué pasa si nos interesa el resultado con una precisión dada, digamos, con dos decimales? Aplicar una expresión ELENCO al valor medio no dará nada por el motivo indicado anteriormente. En realidad,
El resultado es 1926,238095. No es lo mismo otra vez. El motivo es que se realizó una conversión de tipo implícita al calcular el promedio. Demos un paso más:

Aquellos. Usamos una conversión implícita del argumento entero a un tipo numérico exacto (NUMÉRICO EXACTO), multiplicándolo por una unidad real, y luego aplicamos una conversión explícita al tipo de resultado de la función agregada.

Se pueden realizar conversiones de tipos similares utilizando la función CONVERTIR:


Aquí convertimos la representación de cadena de fecha a tipo fecha y hora, después de lo cual ejecutamos conversión inversa para mostrar el resultado del formateo. Como no se especifica el argumento de estilo, se utiliza el valor predeterminado (0 o 100). Como resultado obtenemos

Lista de todos valores posibles argumento estilo se puede encontrar en BOL.

declaración de CASO

Supongamos que desea mostrar una lista de todos los modelos de PC indicando sus precios. Además, si el modelo no está en oferta (no en la tabla RS), en lugar del precio, muestra el texto: "Agotado".
Se puede obtener una lista de todos los modelos de PC con precios mediante la solicitud:

SELECCIONE DISTINTO producto.modelo, precio DEL producto IZQUIERDO UNIRSE pc c
EN producto.modelo = c.modelo
DONDE producto.tipo="pc";

En el conjunto de resultados, el precio faltante se reemplazará con un valor NULL:
modelo precio
1121 850
1232 350
1232 400
1232 600
1233 600
1233 950
1233 980
1260 350
2111 NULO
2112 NULO

Para reemplazar valores NULL con el texto deseado, puede usar el operador CASO:
Operador CASO Dependiendo de las condiciones especificadas, devuelve uno de muchos valores posibles. En nuestro ejemplo, la condición es comprobar si hay NULL. Si se cumple esta condición, se devuelve el texto "Agotado", de lo contrario ( DEMÁS) devuelve el valor del precio. Hay uno aquí punto fundamental. Dado que el resultado del operador SELECCIONAR es siempre una tabla, entonces todos los valores de cualquier columna deben ser del mismo tipo de datos (sujeto a conversión de tipos implícita). Por lo tanto no podemos junto con el precio ( tipo numérico) genera una constante simbólica. Es por eso que se aplica una conversión de tipo al campo precio para convertir sus valores a una representación simbólica. Como resultado obtenemos
modelo precio
1121 850
1232 350
1232 400
1232 600
1233 600
1233 950
1233 980
1260 350
2111 No disponible
2112 No disponible

Operador CASO se puede utilizar en una de dos formas de notación sintáctica:

1er formulario
CASO<проверяемое выражение>
CUANDO<сравниваемое выражение 1>
ENTONCES<возвращаемое значение 1>

CUANDO<сравниваемое выражение N>
ENTONCES<возвращаемое значение N>
FIN

2da forma
CASO
CUANDO<предикат 1>
ENTONCES<возвращаемое значение 1>

CUANDO<предикат N>
ENTONCES<возвращаемое значение N>
FIN

Todas las ofertas CUANDO debe tener la misma forma sintáctica, es decir No se pueden mezclar la primera y la segunda forma. Cuando se utiliza la primera forma sintáctica, la condición CUANDO satisfecho tan pronto como el valor expresión que se está probando se volverá igual el significado de la expresión especificado en la oferta CUANDO. Cuando se utiliza la segunda forma sintáctica, la condición CUANDO satisfecho tan pronto como predicado se evalúa como VERDADERO. Si se cumple la condición, el operador CASO devuelve el valor especificado en la cláusula correspondiente ENTONCES. Si ninguna de las condiciones CUANDO falla, se utilizará el valor especificado en la cláusula DEMÁS. Con ausencia DEMÁS, se devolverá un valor NULL. Si se cumplen varias condiciones, se devolverá el valor de la frase. ENTONCES el primero de ellos.
En el ejemplo anterior, se utilizó la segunda forma del operador. CASO.
Tenga en cuenta que para verificar NULL, el estándar ofrece una forma más corta del operador: JUNTARSE. Este operador tiene un número arbitrario de parámetros y devuelve el primer valor no NULL. Para dos parámetros, el operador COALESCE(A, B) es equivalente al siguiente operador CASO:

CASO CUANDO A NO ES NULO ENTONCES A ELSE B FINAL

La solución al ejemplo anterior usando el operador. JUNTARSE se puede reescribir de la siguiente manera:

Usando la primera forma sintáctica del operador CASO se puede demostrar en lo siguiente ejemplo : muestra todos los modelos de PC disponibles con precios. Marque los modelos más caros y baratos.

SELECCIONE DISTINTO modelo, precio,
Precio CASE CUANDO (SELECCIONE MAX(precio) DESDE pc) ENTONCES "El más caro"
CUANDO (SELECCIONE MIN(precio) DE la pc) ENTONCES "Más barato"
DEMÁS" precio promedio"FIN comentario
DESDE pc PEDIR POR precio;

Como resultado de ejecutar la solicitud, obtenemos

modelo precio comentario
1232 350 El más barato
1260 350 El más barato
1232 400 precio promedio
1233 400 precio promedio
1233 600 precio promedio
1121 850 precio promedio
1233 950 precio promedio
1233 980 Querido

Durante la ejecución de un programa PL/SQL, a menudo existe la necesidad de convertir datos de un tipo a otro. La conversión se puede realizar de dos formas:

  • Implícitamente- buscar " opcion optima» confiado al núcleo de ejecución PL/SQL;
  • Obviamente- la conversión se realiza mediante una llamada de función o la correspondiente instrucción PL/SQL.

En esta sección, primero entenderemos cómo se realizan las conversiones implícitas en PL/SQL y luego pasaremos a explorar las funciones y operadores de conversión explícitos.

Conversión de tipo implícita

Cuando PL/SQL detecta la necesidad de conversión, intenta convertir el valor al tipo correcto. Te sorprenderá la frecuencia con la que se hace esto. En la Fig. La Figura 1 muestra los tipos de conversiones de tipos implícitas realizadas por PL/SQL.

Arroz. 1

La conversión de tipos implícita se produce especificando un valor literal en una declaración o expresión en el formato interno correcto, que PL/SQL convierte según sea necesario. En el siguiente ejemplo, PL/SQL convierte la cadena literal "125" al valor numérico 125 y lo asigna a una variable numérica:

DECLARAR un_número NÚMERO; COMENZAR un_número:= "125"; FIN;

La conversión de tipos implícita también se realiza cuando se pasan parámetros a un programa en un formato distinto al que utiliza. En el siguiente procedimiento, este parámetro es la fecha. Cuando llama a este procedimiento, le pasa una cadena en el formato DD-MMM-AA, que se convierte automáticamente en una fecha:

PROCEDIMIENTO change_hiredate (emp_id_in EN INTEGER, Hiredate_in EN FECHA) change_hiredate (1004, "12-DIC-94");

La conversión implícita de cadena a fecha se realiza según la especificación NLS_DATE_FORMAT. El problema es que si hay un cambio NLS_DATE_FORMAT el programa se verá interrumpido.

Limitaciones de la conversión implícita

Como se puede ver en la Fig. 1. La conversión solo se puede realizar entre ciertos tipos de datos; PL/SQL no puede convertir tipo personalizado datos a cualquier otro. Además, algunas conversiones de tipos implícitas generan excepciones. Considere la siguiente operación de asignación:

DECLARAR un_número NÚMERO; COMENZAR un_número:= "abc"; FIN;

En PL/SQL no se puede convertir la cadena "abc" en un número, por lo que ejecutar el código anterior genera una excepción VALOR_ERROR. Debe asegurarse de que el valor para el cual PL/SQL realiza una conversión de tipo se pueda convertir sin errores.

Desventajas de la conversión implícita

La conversión de tipos implícita tiene varias desventajas.

  • PL/SQL es un lenguaje de tipo estático. Las conversiones implícitas significan que se pierden algunos de los beneficios de la escritura estática, como la claridad y confiabilidad del código.
  • Cada conversión implícita significa una pérdida parcial de control sobre el programa. El programador no lo ejecuta él mismo ni lo controla de ninguna manera, solo asume que se ejecutará y dará el efecto deseado. Aquí hay un elemento de incertidumbre: si Oracle cambia la forma o la condición de las conversiones, el programa puede verse afectado.
  • La conversión de tipos implícita en PL/SQL depende del contexto. Puede que funcione en un programa y en otro no, aunque a simple vista el código parezca el mismo. Además, el resultado de la conversión de tipos no siempre corresponde a las expectativas del programador.
  • Un programa es más fácil de leer y comprender si los datos que contiene se convierten explícitamente, ya que esto captura las diferencias entre los tipos de datos en diferentes mesas o en una tabla y código. Excluido del programa acciones ocultas, elimina la posibilidad de errores.

Por lo tanto, en SQL y PL/SQL se recomienda evitar la conversión de tipos implícita. Es mejor utilizar funciones que realicen una conversión explícita; esto garantiza que el resultado de la conversión coincida exactamente con sus expectativas.

Conversión de tipo explícita

Oracle proporciona un conjunto completo de funciones y operadores que se pueden utilizar para realizar la conversión de tipos de datos a SQL y PL/SQL. Su Lista llena se da en la tabla. 1. La mayoría de las funciones se describen en otros capítulos del libro (para ellas, el número del capítulo se indica en la última columna).

Tabla 1. Funciones de conversión de tipos en PL/SQL

Función Conversión en curso
ASCIISTR Cadena de cualquier conjunto de caracteres a cadena ASCII del juego de caracteres de la base de datos
ELENCO Un tipo de datos integrado o valor de colección en otro tipo de datos integrado o colección. Este método se puede utilizar en lugar de funciones tradicionales (como HASTA LA FECHA)
CHARTOROWID Tipo de cadena a valor ROWID
CONVERTIR Una cadena de un juego de caracteres a otro
DESDE_TZ En tipo de valor MARCA DE TIEMPO agrega información sobre la zona horaria, convirtiéndola así en un valor como MARCA DE TIEMPO CON ZONA HORARIA
HEXTORA Valor hexadecimal para escribir valor CRUDO
MULTICONJUNTO Tabla de base de datos a colección
NUMTODSINTERVAL INTERVALO DÍA A SEGUNDO
NUMTOYMINTERVAL Número (o expresión numérica) a literal INTERVALO AÑO A MES
RAWTOHEX, RAWTONHEX Escriba valor CRUDO a formato hexadecimal
REFTOHEX Escriba valor ÁRBITRO a una cadena de caracteres que contiene su representación hexadecimal
ROWIDTOCHAR, ROWIDTONCHAR Tipo de valor binario ROWID a una cadena de caracteres
MESA Colección en una tabla de base de datos; su acción es inversa a la función MULTICONJUNTO
EL Valor de columna a fila de la tabla de base de datos virtual
TO_BINARY_FLOAT Número o cadena en BINARIO_FLOAT
TO_BINARY_DOUBLE Número o cadena en BINARIO_DOBLE
TO_CHAR, TO_NCHAR (versión numérica) Número a cadena ( VARCHAR2 o NVARCHAR2 respectivamente)
TO_CHAR, TO_NCHAR (versión de fecha) Fecha a cadena
TO_CHAR, TO_NCHAR (versión del personaje) Datos del juego de caracteres de la base de datos al juego de caracteres del idioma nacional
TO_BLOB Escriba valor CRUDO V GOTA
TO_CLOB, TO_NCLOB Escriba valor VARCHAR2, NVARCHAR2 o NCLOB V CLOB(o NCLOB)
HASTA LA FECHA Cadena hasta la fecha
TO_DSINTERVAL Tipo de cadena de caracteres CARACTERÍSTICA, VARCHAR2, NCHAR o NVARCHAR2 en tipo DÍA DE INTERVALO AL SEGUNDO
TO_LOB Escriba valor LARGO V LOB
TO_MULTI_BYTE Caracteres de un solo byte de la cadena de origen a sus equivalentes de varios bytes (si es posible)
AL NUMERO Una cadena o número (por ejemplo, BINARIO_FLOAT) V. NÚMERO
TO_RAW Escriba valor GOTA V CRUDO
TO_SINGLE_BYTE Caracteres multibyte de la cadena original en caracteres de un solo byte correspondientes
A_TIMESTAMP MARCA DE TIEMPO
TO_TIMESTAMP_TZ Cadena de caracteres a tipo de valor TO_TIMESTAMP_TZ
TO_YMINTERVAL Tipo de cadena de caracteres CARACTERÍSTICA, VARCHAR2, NCHAR o NVARCHAR2 a un valor de tipo INTERVALO AÑO A MES
TRADUCIR...USANDO Texto al juego de caracteres especificado para convertir el juego de caracteres de la base de datos al juego de caracteres nacional
UNISTR Una cadena de cualquier conjunto de caracteres en Unicode

Función CHARTOROWID

Convierte una cadena como CARBONIZARSE o VARCHAR2 a un valor de tipo ROWID. Sintaxis de la función:

FUNCIÓN CHARTOROWID (fila fuente EN CHAR) RETORNO ROWID FUNCIÓN CHARTOROWID (fila fuente EN VARCHAR2) RETORNO ROWID

Para una conversión exitosa mediante la función CHARTOROWID la línea debe constar de 18 caracteres en el formato:

OOOOOFFFFBBBBBBSSSS

donde OOOOOO es el número de objeto de datos, FFF es el número de archivo de base de datos relativo, BBBBBBB es el número de bloque en el archivo y CCC es el número de línea en el bloque. Los cuatro componentes se especifican en el formato. Base64. Si la cadena fuente no se ajusta a este formato, se lanza una excepción VALOR_ERROR .

Función de reparto

Función ELENCO Es un mecanismo de conversión de datos muy conveniente y flexible. Convierte el valor de cualquier (o casi cualquier) tipo o colección de datos integrados en otro tipo o colección de datos integrados, y probablemente resultará familiar para todos los programadores con experiencia en lenguajes orientados a objetos.

Usando la función ELENCO puede convertir una expresión sin nombre (número, fecha, NULO e incluso el resultado de una subconsulta) o una colección con nombre (como una tabla anidada) en un tipo de datos o una colección con nombre de un tipo compatible. Las conversiones válidas entre tipos de datos integrados se muestran en la Fig. 2. Deberán observarse las siguientes reglas:

  • No se permite la conversión de tipos de datos. LARGO, LARGO CRUDO, cualquier tipo de datos LOB y tipos específicos de Oracle;
  • designación " FECHA"La figura muestra los tipos de datos. FECHA, MARCA DE TIEMPO, MARCA DE TIEMPO CON ZONA HORARIA, INTERVALO DÍA A SEGUNDO e INTERVALO AÑO A MES;
  • Para convertir una colección con nombre de un determinado tipo en una colección con nombre de otro tipo, los elementos de ambas colecciones deben tener el mismo tipo;

Arroz. 2.

  • tipo UROWID no se puede convertir a ROWID, Si UROWID contiene el valor ROWID tablas de índice.

A continuación se muestra un ejemplo del uso de la función. ELENCO para convertir tipos de datos escalares. Su llamada se puede incluir en un comando SQL:

SELECCIONE empleado_id, emitir (fecha_contratación COMO VARCHAR2 (30)) DEL empleado;

También se puede llamar en sintaxis PL/SQL:

DECLARAR hd_display VARCHAR2(30); COMENZAR hd_display:= CAST (SYSDATE AS VARCHAR2); FIN;

Aplicación mucho más interesante. ELENCO encontrado al trabajar con colecciones PL/SQL (tablas anidadas y VARRAY) porque esta función le permite convertir una colección de un tipo a otro. Además, ELENCO se puede utilizar para operar (desde sentencias SQL) en una colección declarada como una variable PL/SQL.

Ambos temas se tratan en detalle en el Capítulo 12 y el siguiente ejemplo brinda una idea de la sintaxis y las capacidades de conversión. Primero creamos dos tipos de tablas anidadas y una tabla relacional:

CREAR TIPO nombres_t COMO TABLA DE VARCHAR2 (100); CREAR TIPO autores_t COMO TABLA DE VARCHAR2 (100); CREAR TABLA autores_favoritos (nombre VARCHAR2(200))

/* Archivo en la Web: cast.sql */ 1 DECLARAR 2 scifi_favorites autores_t 3:= autores_t ("Sheri S. Tepper", "Orson Scott Card", "Gene Wolfe"); 4 BEGIN 5 DBMS_OUTPUT.put_line ("Te recomiendo que leas libros de:"); 6 7 PARA rec IN (SELECCIONE valor_columna favoritos 8 DE LA TABLA (CAST (scifi_favorites AS nombres_t)) 9 UNION 10 SELECCIONE NOMBRE 11 DE autores_favoritos) 12 BUCLE 13 DBMS_OUTPUT.put_line (rec.favs); 14 BUCLE FINAL; 15 FINAL;

Las líneas 2 y 3 declaran una tabla anidada local poblada con los nombres de varios autores populares. En las líneas 7 a 11 usando el operador UNIÓN las filas de la tabla están fusionadas autores_favoritos Y favoritos_de ciencia ficción. Para ello, una mesa anidada favoritos_de ciencia ficción(local y no visible para el motor SQL) se convierte usando la función ELENCO a una colección como nombres_t. Esta conversión es posible debido a la compatibilidad de sus tipos de datos. Después de la conversión, llame al comando MESA le dice al motor SQL que la tabla anidada debe interpretarse como relacional. Los siguientes resultados se muestran en la pantalla:

Te recomiendo que leas libros de: Gene Wolfe Orson Scott Card Robert Harris Sheri S. Tepper Tom Segev Toni Morrison

Función CONVERTIR

Convierte una cadena de un juego de caracteres a otro. Sintaxis de la función:

FUNCIÓN CONVERTIR (cadena_original EN VARCHAR2, nuevo_charset VARCHAR2 [, old_charset VARCHAR2]) DEVOLVER VARCHAR2

Tercer argumento conjunto_de_caracteres_antiguo es opcional. Si no se especifica, se utiliza el juego de caracteres predeterminado de la base de datos.

Función CONVERTIR no traduce palabras o frases de un idioma a otro, sino que reemplaza letras o símbolos de un conjunto de caracteres por letras o símbolos de otro.

Los dos juegos de caracteres más comunes son WE8MSWIN1252 (juego de caracteres de 8 bits personajes de microsoft ventanas página de código 1252) y AL16UTF16 (juego de caracteres Unicode de 16 bits).

Función HEXTRAW

Convierte una cadena hexadecimal como CARBONIZARSE o VARCHAR2 a un valor de tipo CRUDO. Sintaxis de función HEXTORA :

FUNCIÓN HEXTORAW (cadena_fuente EN CHAR) DEVOLVER RAW FUNCIÓN HEXTORAW (cadena_fuente EN VARCHAR2) DEVOLVER RAW

Función RAWTOHEX

Convierte un valor de tipo CRUDO a una cadena hexadecimal como VARCHAR2. Sintaxis de función RAWTOHEX :

FUNCIÓN RAWTOHEX (valor_binario EN RAW) DEVOLVER VARCHAR2

Función RAWTOHEX siempre devuelve una cadena Longitud variable, aunque su inversa es una función sobrecargada HEXTORA admite ambos tipos de cadenas.

función ROWIDTOCHAR

Convierte un tipo de valor binario ROWID a una cuerda como VARCHAR2. Sintaxis de función ROWIDTOCHAR :

FUNCIÓN ROWIDTOCHAR (fila_fuente EN ROWID) DEVOLVER VARCHAR2

La cadena devuelta por la función tiene el siguiente formato:

OOOOOFFFFBBBBBBSSSS

donde OOOOOO es el número del objeto de datos, FFF es el número relativo del archivo de base de datos, BBBBBB es el número de bloque del archivo y CCC es el número de línea del bloque PL/SQL. Los cuatro componentes están especificados en formato Base64. Ejemplo:

AAARYiAAEAAAEG8AAB

Las implementaciones del lenguaje SQL pueden realizar conversiones de tipos implícitas. Entonces, por ejemplo, en T-SQL al comparar o combinar valores de tipos pequeño Y En t, tipo de datos pequeño se convierten implícitamente en tipo En t. Puede leer más sobre la conversión de tipos explícita e implícita en MS SQL Server en BOL.

Ejemplo. Muestra el precio medio de los blocs de notas de PC con el texto anterior “precio medio =”.
Intentando completar una solicitud

Como resultado, obtenemos lo que necesitábamos:

Usamos una expresión de conversión de tipo explícita. ELENCO para convertir el valor del precio promedio en una representación de cadena. Sintaxis de expresiones ELENCO muy simple:

ELENCO(<выражение>COMO<тип данных>)

En primer lugar, hay que tener en cuenta que no todas las conversiones de tipos son posibles (el estándar contiene una tabla de conversiones de tipos de datos permitidas). En segundo lugar, el resultado de la función. ELENCO para un valor de expresión igual a NULL, también será NULL.
Veamos uno más ejemplo : determine el año promedio de botadura de barcos a partir de la tabla Barcos. Pedido

SELECCIONE AVG (lanzado) DESDE los barcos;

dará el resultado 1926. En principio, todo es correcto, porque Como resultado, obtuvimos lo que pedimos: UN AÑO. Sin embargo, la media aritmética será aproximadamente 1926,2381. Cabe señalar aquí que las funciones agregadas (con la excepción de la función CONTAR, que siempre devuelve un número entero) heredan el tipo de datos de los valores procesados. Dado que el campo lanzado es un número entero, obtuvimos el valor promedio descartando la parte fraccionaria (tenga en cuenta que no se redondeó).
¿Qué pasa si nos interesa el resultado con una precisión dada, digamos, con dos decimales? Aplicar una expresión ELENCO al valor medio no dará nada por el motivo indicado anteriormente. En realidad,

El resultado es 1926,238095. No es lo mismo otra vez. El motivo es que se realizó una conversión de tipo implícita al calcular el promedio. Demos un paso más:

Aquellos. Usamos una conversión implícita del argumento entero a un tipo numérico exacto (NUMÉRICO EXACTO), multiplicándolo por una unidad real, y luego aplicamos una conversión explícita al tipo de resultado de la función agregada.

Se pueden realizar conversiones de tipos similares utilizando la función CONVERTIR:

Aquí convertimos la representación de cadena de fecha a tipo fecha y hora, después de lo cual realizamos la conversión inversa para demostrar el resultado del formateo. Como no se especifica el argumento de estilo, se utiliza el valor predeterminado (0 o 100). Como resultado obtenemos

A continuación se muestran algunos otros valores de argumentos. estilo y el resultado obtenido del ejemplo anterior. Tenga en cuenta que los valores estilo Las centenas más grandes dan como resultado una visualización del año de cuatro dígitos.

Lista de todos los valores de argumento posibles estilo se puede encontrar en BOL.

Supongamos que desea mostrar una lista de todos los modelos de PC indicando sus precios. Además, si el modelo no está en oferta (no en la tabla RS), en lugar del precio, muestra el texto: "Agotado".
Se puede obtener una lista de todos los modelos de PC con precios mediante la solicitud:

Para reemplazar valores NULL con el texto deseado, puede usar el operador CASO:

Operador CASO Dependiendo de las condiciones especificadas, devuelve uno de muchos valores posibles. En nuestro ejemplo, la condición es comprobar si hay NULL. Si se cumple esta condición, se devuelve el texto "Agotado", de lo contrario ( DEMÁS) devuelve el valor del precio. Hay un punto fundamental aquí. Dado que el resultado del operador SELECCIONAR Siempre es una tabla, entonces todos los valores de cualquier columna deben ser del mismo tipo de datos (sujeto a conversión de tipos implícita). Por lo tanto, no podemos generar una constante simbólica junto con el precio (tipo numérico). Es por eso que se aplica una conversión de tipo al campo precio para convertir sus valores a una representación simbólica. Como resultado obtenemos

Operador CASO se puede utilizar en una de dos formas de notación sintáctica:

1er formulario
CASO<проверяемое выражение>
CUANDO<сравниваемое выражение 1>
ENTONCES<возвращаемое значение 1>

CUANDO<сравниваемое выражение N>
ENTONCES<возвращаемое значение N>
FIN

2da forma
CASO
CUANDO<предикат 1>
ENTONCES<возвращаемое значение 1>

CUANDO<предикат N>
ENTONCES<возвращаемое значение N>
FIN

Todas las ofertas CUANDO debe tener la misma forma sintáctica, es decir No se pueden mezclar la primera y la segunda forma. Cuando se utiliza la primera forma sintáctica, la condición CUANDO satisfecho tan pronto como el valor expresión que se está probando se convertirá igual al valor expresión especificada en la oración CUANDO. Cuando se utiliza la segunda forma sintáctica, la condición CUANDO satisfecho tan pronto como predicado se evalúa como VERDADERO. Si se cumple la condición, el operador CASO devuelve el valor especificado en la cláusula correspondiente ENTONCES. Si ninguna de las condiciones CUANDO falla, se utilizará el valor especificado en la cláusula DEMÁS. Con ausencia DEMÁS, se devolverá un valor NULL. Si se cumplen varias condiciones, se devolverá el valor de la frase. ENTONCES el primero de ellos.
En el ejemplo anterior, se utilizó la segunda forma del operador. CASO.
Tenga en cuenta que para verificar NULL, el estándar ofrece una forma más corta del operador: JUNTARSE. Este operador tiene un número arbitrario de parámetros y devuelve el primer valor no NULL. Para dos parámetros, el operador COALESCE(A, B) es equivalente al siguiente operador CASO:

CASO CUANDO A NO ES NULO ENTONCES A ELSE B FINAL

La solución al ejemplo anterior usando el operador. JUNTARSE se puede reescribir de la siguiente manera:

Usando la primera forma sintáctica del operador CASO se puede demostrar en lo siguiente ejemplo : muestra todos los modelos de PC disponibles con precios. Marque los modelos más caros y baratos.

SELECCIONE DISTINTO modelo, precio,
Precio CASE CUANDO (SELECCIONE MAX(precio) DESDE pc) ENTONCES 'El más caro'
CUANDO (SELECCIONE MIN(precio) DESDE la pc) ENTONCES 'Más barato'
ELSE 'Precio medio' comentario FINAL
DESDE pc PEDIR POR precio;

Como resultado de ejecutar la solicitud, obtenemos

modelo precio comentario
1232 350 El más barato
1260 350 El más barato
1232 400 precio promedio
1233 400 precio promedio
1233 600 precio promedio
1121 850 precio promedio
1233 950 precio promedio
1233 980 Querido

blusas y camisas del fabricante
niko-opt.com
Electrocardiógrafo ext 12-03 alta comprar cardiomc.com.ua
cardiomc.com.ua
producción de cabañas
Catálogo de productos, características técnicas. Catalogo de producto.
module-house.ru

Conversión de datos

Última actualización: 29/07/2017

Cuando asignamos un valor de un tipo a una columna que almacena datos de otro tipo, o realizamos operaciones que involucran datos diferentes tipos SQL Server intenta realizar una conversión y convertir el valor utilizado a el tipo correcto. Pero SQL Server no puede realizar todas las conversiones automáticamente. SQL Server puede realizar conversiones implícitas de un tipo con menor prioridad a un tipo con alta prioridad. Tabla de prioridades (cuanto mayor es la prioridad):

fecha y hora
pequeña fecha y hora
flotar
real
decimal
dinero
poco dinero
En t
pequeño
diminuto
poco
nvarchar
nchar
varchar
carbonizarse

Es decir, SQL Server puede convertir automáticamente el número 100.0 (flotante) en una fecha y hora (fecha y hora).

En los casos en los que sea necesario realizar conversiones de tipos con mayor prioridad a tipos con menor prioridad, entonces es necesario realizar una conversión de tipos explícita. Para hacer esto, T-SQL define dos funciones: CONVERTIR y CAST.

La función CAST convierte una expresión de un tipo en otro. Tiene la siguiente forma:

CAST(expresión AS tipo_datos)

Por ejemplo, tome las siguientes tablas:

CREAR TABLA Productos (Id INT IDENTIDAD CLAVE PRIMARIA, Nombre del producto NVARCHAR(30) NOT NULL, Fabricante NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Precio DINERO NO NULL); CREAR TABLA Clientes (Id INT IDENTITY PRIMARY KEY, Nombre NVARCHAR(30) NOT NULL); CREAR TABLA Pedidos (Id INT IDENTIDAD CLAVE PRIMARIA, ProductId INT NO NULO REFERENCIAS Productos (Id) EN ELIMINAR CASCADA, CustomerId INT NO NULO REFERENCIAS Clientes (Id) EN ELIMINAR CASCADA, Creado en la FECHA NO NULO, ProductCount INT DEFAULT 1, Precio DINERO NO NULO );

Por ejemplo, al mostrar información sobre pedidos, convierte un valor numérico y una fecha en una cadena:

SELECCIONAR Id., CAST (Creado en AS nvarchar) + '; total: ' + CAST(Precio * ProductCount AS nvarchar) FROM Pedidos

Convertir

La mayoría de las transformaciones están cubiertas por la función CAST.

Funciones CAST y CONVERT (Transact-SQL)

Si se necesita algún formato adicional, puede utilizar la función CONVERTIR. Tiene la siguiente forma:

CONVERTIR(tipo_datos, expresión [, estilo])

El tercer parámetro opcional especifica el estilo de formato de datos. Este parámetro representa un valor numérico que tiene diferentes interpretaciones para diferentes tipos de datos. Por ejemplo, algunos valores para formatear fechas y horas:

    o - formato de fecha “Mon dd aaaa hh:miAM/PM” (valor predeterminado)

    o - formato de fecha "dd/mm/aaaa"

    o - formato de fecha “dd/mm/aaaa”

    o - formato de fecha "Lunes dd, aaaa hh:miAM/PM"

    o - formato de fecha "hh:mi:ss"

    o - formato de fecha "dd-mm-aaaa"

    o - formato de fecha “hh:mi:ss:mmmm” (formato de hora de 24 horas)

Algunos valores para formatear datos monetarios en una cadena:

    — sólo quedan dos dígitos en la parte fraccionaria del número (por defecto)

    - solo quedan dos dígitos en la parte fraccionaria del número y se usa una coma para separar los dígitos

    - solo quedan cuatro dígitos en la parte fraccionaria del número

Por ejemplo, mostremos la fecha y el costo de los pedidos con formato:

SELECCIONAR CONVERTIR (nvarchar, CreadoEn, 3), CONVERTIR (nvarchar, Precio * ProductoCount, 1) DESDE Pedidos

TRY_CONVERT

Cuando se utilizan las funciones CAST y CONVERT, SQL Server genera una excepción si los datos no se pueden convertir a un cierto tipo. Por ejemplo:

SELECCIONAR CONVERTIR(int, 'sql')

Para evitar generar una excepción, puede utilizar la función TRY_CONVERT. Su uso es similar a la función CONVERTIR, excepto que si la expresión no se puede convertir al tipo deseado, la función devuelve NULL:

SELECCIONE TRY_CONVERT(int, 'sql') - NULL SELECCIONE TRY_CONVERT(int, '22') - 22

Funciones adicionales

Además de CAST, CONVERT, TRY_CONVERT, hay varias funciones que se pueden usar para convertir a varios tipos:

    STR(float [, length [,decimal]]): Convierte un número en una cadena. El segundo parámetro indica la longitud de la línea y el tercero: cuántos dígitos deben quedar en la parte fraccionaria del número.

    CHAR(int): convierte un código numérico ASCII en un carácter. A menudo se utiliza para situaciones en las que se necesita un carácter que no se puede ingresar desde el teclado.

    ASCII(char): convierte un carácter en código numérico ASCII

    NCHAR(int): convierte un código numérico UNICODE en un carácter

    UNICODE(char): convierte un carácter en un código numérico UNICODE

SELECCIONE STR(123.4567, 6,2) — 123.46 SELECCIONE CHAR(219) — ы SELECCIONE ASCII(‘ы’) — 219 SELECCIONE NCHAR(1067) — ы SELECCIONE UNICODE(‘ы’) — 1067

Referencia SQL

Conversión de tipo

El conjunto de tipos permitidos para la conversión a construcciones CAST AS está determinado por la implementación del DBMS. Entonces en MySQL solo puede convertir siguientes tipos: binario[(n)], char[(n)], fecha, fecha y hora, decimal[(m[,d])], con signo, hora, sin signo. Y en Oracle, además de convertir tipos integrados, puede convertir selecciones con muchos registros en matrices.

PostgreSQL tiene capacidades de conversión más avanzadas. Primero, puede agregar su propia transformación para componentes integrados y tipos personalizados. En segundo lugar, existe su propio operador de conversión de tipos más conveniente::.

En la mayoría de los casos, es necesaria la conversión hacia o desde una cadena.

Operadores aritméticos SQL básicos

En este caso, los DBMS proporcionan funciones adicionales.

Funciones de Oracle

  • to_char(fecha [,formato[,nlsparams]]) - fecha a la cadena;
  • to_char(número [,formato[,nlsparams]]) - número a cadena;
  • hasta la fecha(cadena[,formato[,nlsparams]]) - cadena hasta la fecha;
  • Al numero(cadena [, formato [, nlsparams]]) - cadena a número;
  • to_timestamp(cadena, formato): cadena en el momento.

En estas funciones, el formato describe el formato de fecha o número y nlsparams contiene parámetros nacionales. El formato de la cadena de fecha se especifica mediante los siguientes elementos:

  • "" — inserta el texto especificado entre comillas;
  • d.C., d.C.— inserta AD con o sin puntos;
  • VS, B.C.— inserta aeronaves con o sin puntos;
  • SS, SCC— inserta un siglo, SCC devuelve las fechas del sol como números negativos;
  • D— inserta el día de la semana;
  • DÍA— inserta el nombre del día, rellenado con espacios hasta una longitud de nueve caracteres;
  • DD— inserta el día del mes;
  • DDD— se inserta el día del año;
  • DY1— se inserta el nombre abreviado del día;
  • FF2— inserta fracciones de segundos independientemente del sistema numérico;
  • NN, NN12— inserta la hora del día (de 1 a 12);
  • NN24— inserta la hora del día (de 0 a 23);
  • MI— inserta minutos;
  • MM— inserta el número del mes;
  • MAMÁ— inserta el nombre abreviado del mes;
  • MESn— inserta el nombre del mes, rellenado con espacios de hasta nueve caracteres;
  • R.M.— inserta el mes en números romanos;
  • R.R.— inserta los dos últimos dígitos del año;
  • RRRR— inserta todo el año;
  • SS— inserta segundos;
  • SSSSS— inserta el número de segundos desde medianoche;
  • WW— inserta el número de la semana del año (la semana es de 7 días desde el primer día y no de lunes a domingo);
  • W.— inserta el número de semana del mes;
  • Y.AAAA— inserta el año con una coma en la posición especificada;
  • AÑO, AÑO— inserta el año, SYEAR devuelve las fechas del sol como números negativos;
  • AAAA, SAAAA— inserta un año de cuatro dígitos, SYYYY devuelve las fechas del sol como números negativos;
  • AAA, AA, Y— inserta el número correspondiente de los últimos dígitos del año.

El formato de cadena numérica se especifica mediante los siguientes elementos:

  • $ — inserta un signo de dólar delante del número;
  • EN— inserta espacios para la parte entera de un número decimal si es igual a cero;
  • MI— inserta un signo menos al final (por ejemplo, "999.999mi");
  • S— inserta un signo numérico al principio o al final (por ejemplo, "s9999" o "9999s");
  • relaciones públicas- escribe un numero negativo entre paréntesis angulares (por ejemplo, "999.999pr");
  • D— inserta un separador de punto decimal en la posición especificada (por ejemplo, "999D999");
  • GRAMO— inserta un separador de grupo en la posición especificada (por ejemplo, "9G999G999"). En este caso, se descarta la parte fraccionaria del número;
  • CON— inserta un identificador de moneda ISO al principio o al final de un número (por ejemplo, "c9999" o "9999c");
  • l— inserta un símbolo de moneda local al principio o al final de un número (por ejemplo, "l9999" o "9999l");
  • , — inserta una coma en la posición especificada, independientemente del separador de grupo;
  • . — inserta un punto decimal en la posición especificada, independientemente del separador de punto decimal;
  • V— devuelve el valor multiplicado por 10^n, donde n es igual al número de nueves después de V. Este valor se redondea si es necesario;
  • EEEE— 9.99EEEE devuelve un valor en notación exponencial;
  • R.M.— El valor RM se escribirá en números romanos en mayúsculas;
  • habitación— el valor rm se escribirá en números romanos minúsculas;
  • 0 — inserta ceros en lugar de espacios al principio o al final de una línea, por ejemplo, 9990 inserta ceros en lugar de espacios al final de una línea;
  • 9 — cada 9 define una cifra significativa.

Funciones de PostgreSQL

  • to_char(marca de tiempo, formato): hora en una cadena;
  • to_char(intervalo, formato) — intervalo de tiempo por línea;
  • to_char(número, formato) - número a cadena;
  • hasta la fecha(cadena, formato) - cadena hasta la fecha;
  • Al numero(cadena, formato) - cadena a número;
  • to_timestamp(cadena, formato) - cadena en el momento.

Los elementos de formato básicos son los mismos que los de Oracle.

Funciones MySQL

  • formato de fecha(fecha,formato) - fecha a cadena;
  • formato de tiempo(hora,formato) - hora en una cadena;
  • formato(número,precisión): número de una cadena como "#,###,###.##", donde el número de caracteres está determinado por el segundo argumento.

A continuación se muestra una lista de elementos de formato básicos para fecha y hora:

  • %C- mes por fecha;
  • %d- día del mes;
  • %H— horas (de 0 a 24);
  • %h— horas (1 a 12);
  • %i- minutos;
  • %s- segundos;
  • %T— hora en el formato “hh:mm:ss”;
  • %Y— año, cuatro dígitos;
  • %año- año, dos dígitos.

Operadores SQL básicos.

SQL (lenguaje de consulta estructurado) consultas estructuradas") - universal lenguaje de ordenador, utilizado para crear, modificar y gestionar datos en bases de datos relacionales. El lenguaje SQL se basa en álgebra relacional y es una colección de operadores.

Hay 4 grupos de operadores. Consideremos un grupo de operadores de manipulación de datos (Lenguaje de manipulación de datos, DML, SQLDML)

selección de datos

La selección de datos es la operación más común realizada con SQL. La declaración SELECT es una de las declaraciones más importantes en este lenguaje y se utiliza para seleccionar datos. La sintaxis de este operador es la siguiente:

SELECCIONAR columna DE la tabla

Las declaraciones SELECT deben contener las palabras SELECT y FROM; otro palabras clave son opcionales.

La palabra clave SELECT va seguida de información sobre qué campos incluir en el conjunto de datos resultante. Un asterisco (*) indica todos los campos de la tabla, por ejemplo:

Para seleccionar una columna, utilice la siguiente sintaxis:

SELECCIONAR Empresa

Un ejemplo de selección de varias columnas se ve así:

SELECCIONE Empresa, Teléfono, Correo

Para especificar los nombres de las tablas de las que se seleccionan los registros, utilice la palabra clave FROM, por ejemplo:

SELECCIONAR * DE Clientes

Esta consulta devolverá todos los campos de la tabla Clientes.

Puede utilizar una cláusula WHERE (opcional) para filtrar los resultados devueltos por una declaración SELECT

SELECCIONAR * DE Productos DONDE Categoría = 4

Puede utilizar varias expresiones en la cláusula WHERE,

DONDE expresión1 [(Y | O) expresión2 ...]

Por ejemplo:

SELECCIONE * DE Productos DONDE Categoría = 2 Y Postavshik > 10

SELECCIONE Nombre, Precio DE Productos DONDE Categoría= 3 O Precio< 50

Puede utilizar los siguientes operadores:

< Меньше

<= Меньше или равно

<>No es igual

> Más

>= Mayor o igual que

La cláusula ORDER BY (opcional) se utiliza para ordenar el conjunto de datos resultante por una o más columnas.

Función CAST de SQL Server

Las palabras clave ASC (ascendente) o DESC (descendente) se utilizan para determinar el orden de clasificación. De forma predeterminada, los datos se ordenan en orden ascendente.

Modificación de datos

Además de la extracción de datos. lenguaje SQL se puede utilizar para actualizar y eliminar datos, copiar registros a otras tablas y realizar otras operaciones. A continuación veremos las declaraciones ACTUALIZAR, ELIMINAR e INSERTAR que se utilizan para resolver algunos de estos problemas.

ACTUALIZAR declaración

Para cambiar valores en una o más columnas de una tabla, use la declaración ACTUALIZAR. La sintaxis de este operador es:

ACTUALIZAR tabla SET columna1 = expresión1 DONDE criterios

La expresión de la cláusula SET puede ser una constante o el resultado de un cálculo. Por ejemplo, para aumentar los precios de todos los productos que cuestan menos de $10, puede ejecutar la siguiente consulta:

ACTUALIZAR Productos SET Precio = Precio * 1.1 DONDE Precio< 10

BORRAR declaración

Para eliminar filas de las tablas debes usar BORRAR operador, cuya sintaxis es:

ELIMINAR DE la tabla DONDE criterios

Eliminar todos los productos cuyo coste sea inferior a 100:

BORRAR DE Productos DONDE Precio< 100

INSERTAR declaración

Para agregar registros a las tablas, debe utilizar la instrucción INSERT, cuya sintaxis es:

INSERTAR EN la tabla ( VALORES (expresión [, ...])

Por ejemplo, puede utilizar la siguiente consulta para agregar un nuevo cliente a la tabla Clientes.




Arriba