Descripción: Devuelve una subcadena de una cadena alfanumérica, empezando en la posición dada y terminando en la longitud dada o en el final de la cadena alfanumérica.
Tipo de resultado: Varchar o BLOB
Sintaxis:
SUBSTRING(cadena_alfanumérica FROM posición_inicial [FOR longitud])
Esta función devuelve una subcadena que empieza en posición_inicial (la posición del primer caracter de la cadena es 1) . Sin el argumento FOR, devuelve todos los caracteres restantes de la cadena alfanumérica. Con el argumento FOR devuelve los siguientes longitud caracteres o los caracteres restantes, lo que sea más corto.
Posición_inicial y longitud también pueden ser columnas o fórmulas que devuelvan números enteros
Esta función soporta BLOBs de texto y binarios de cualquier longitud. Si cadena_alfanumérica es un BLOB, el resultado es también un BLOB. En todos los demás casos el resultado es un Varchar.
Si el argumento no es un BLOB, la longitud del resultado siempre es igual a la longitud de cadena_alfanumérica, sin importar ni la posición_inicial ni la longitud. Así, por ejemplo, SUBSTR(‘Napoleón’ FROM 4 FOR 2) devolverá un Varchar(8) porque la palabra ‘Napoleón’ tiene 8 caracteres y ese Varchar contendrá la palabra ‘ol’.
Si cualquiera de los argumentos es NULL, el resultado será NULL.
Ejemplo:
INSERT INTO PROCEDENCIAS (PRO_CODPAI) SELECT SUBSTRING(PAI_NOMBRE FROM 1 FOR 3) FROM PAISES
Este INSERT insertará una fila a la tabla PROCEDENCIAS. La columna PRO_CODPAI (código del país) contendrá los primeros 3 caracteres del nombre del país, obtenidos de la tabla PAISES.
.
El índice del blog Firebird21 | Firebird SQL
Jun 17, 2013 @ 04:43:26
Angie
Jul 22, 2014 @ 13:20:08
estuve viendo las funciones internas que publicaste en tu blog y otras que vi en otro foro de firebird pero no encuentro alguna que me ayude a verificar si el dato substraído de una cadena es numérico.Hay alguna función que me ayude con esto? ya que tengo una tabla que aumenta un folio, pero dicho folio es una cadena por decir FA9000, debe seguir FA9001, pero necesito separar el numero del final de la cadena y aumentarlo, solo que no se como validar que sea un numero y así separarlo de los demás caracteres
Alexis
Jul 23, 2014 @ 08:03:28
Hola Angie.
No se si esto te ayude, puesto que no soy experto, pero yo suelo hacer tres columnas con todos los datos que mencionas para evitar problemas. Es decir ID (numero único), TIPO_DE_DOC(FA en tu caso), NR(numero).
Ornaldo
Sep 17, 2015 @ 11:36:24
Hola Angie. No se pero cuando necesito hacer algo de eso uso SUBSTRING acompañado de un CAST para convertir la subcadena en un entero como es tu caso en caso de no ser posible CAST dispara un mensaje de error, aqui te dejo un PROCEDURE que hice probando tu ejemplo y su llamada
create procedure PRUEBA (ENTRADA varchar(6))
returns (SALIDA smallint)
as
begin
SALIDA = CAST(SUBSTRING(:ENTRADA FROM 3 FOR 4) AS SMALLINT)+1;
SUSPEND;
end
y despues lo llame así para probarlo
SELECT * FROM PRUEBA(‘FA9000’);
y me respondió 9,001
si le pones por ejemplo
SELECT * FROM PRUEBA(‘FA900A’);
Me responde
Overflow ocurred during data type conversion.
conversion error from string «900A»
At procedure ‘PRUEBA’ line:7 col:7
Pero si deseas manejar tu misma la validación, entonces es mejor crear un PROCEDURE VALIDAENTERO que acepte una cadena como entrada y que la separe caracter por caracter usando SUBSTRING y averigue si ese caracter esta entre (‘0′,’1′,’2′,’3′,’4′,’5′,’6′,’7′,’8′,’9’) si alguno de los caracteres de esa cadena falla entonces la cadena de entrada no es un entero y devuelves una variable de salida=0 (mal)
de lo contrario si todo esta bien devuelves la variable de salida=1 (bien)
y ya puedes convertir tu cadena a entero usando
CAST(SUBSTRING(‘FA9000’ from 3 FOR 4) AS SMALLINT) con la certeza de que es un numero entero
Diego Calderon
Ago 13, 2015 @ 16:23:37
Hola..y gracias por la colaboracion…quisiera saber si me puedes ayudar…pues soy muy novato..
es que estoy tratando de hacer una consulta a una BD en firebird desde excel con la siguiente consulta:
SELECT VENTATICKETS.FOLIO, VENTATICKETS.NOMBRE, VENTATICKETS.CREADO_EN, VENTATICKETS.TOTAL, VENTATICKETS.CLIENTE_ID, VENTATICKETS.PAGO_CON, VENTATICKETS.NOTAS, VENTATICKETS.IMPRIMIR_NOTA, VENTATICKETS.FORMA_PAGO
FROM VENTATICKETS VENTATICKETS
WHERE (VENTATICKETS.CREADO_EN>={ts ‘2015-08-01 00:00:00.000’}) AND (VENTATICKETS.CREADO_EN<={ts '2015-08-08 11:59:59.000'}) AND (VENTATICKETS.ESTA_CANCELADO='f') AND (VENTATICKETS.FORMA_PAGO='e')
Order by ventatickets. Folio
pero resulta que al mostrarme los datos en la hoja en excel el campo "VENTATICKETS.NOTA" NO me lo muestra el campo en la hoja…investigando un poco vi que es un campo tipo "BLOP" pero que tiene almacenado es texto normalmente…
que debo modificar para que me inserte ese campo?
gracias
wrov
Ago 13, 2015 @ 17:44:14
Bueno, en primer lugar, tienes una cantidad impresionante de innecesarios VENTATICKETS. Como estás usando una sola tabla, no es necesario que antes de cada columna coloques el nombre de esa tabla.
Segundo, para cambiar el tipo de datos de una columna se usa la función CAST()
El número que está entre paréntesis (128) es solamente un ejemplo, puedes poner allí cualquier número entero que desees, con la condición de que esté comprendido entre 1 y 32765.
Tercero, el tipo de datos no se llama «BLOP» sino que se llama «BLOB» y proviene de Binary Large OBject.
Saludos.
Walter.
diego Calderon
Ago 13, 2015 @ 21:58:15
walter ..gracias por el tiempo y tu respuesta… pero fijate que me sale lo siguiente cuando hago la consulta en excel:
[ODBCfirebird Driver] [Firebird] conversion error from string «BLOB»
y viendo la tabla y el campo nota..le doy en propiedades y sale esto:
fieldname: NOTAS
fieldtype: TNOTAS
blob subtype: BINARY
wrov
Ago 14, 2015 @ 12:21:26
Quizás tu columna NOTAS tiene demasiados caracteres, podrías probar escribiendo:
CAST(LEFT(TRIM(NOTAS), 128) AS VARCHAR(128))
Puedes cambiar los números 128 que son sólo un ejemplo, para encontrar el más adecuado a tu caso.
Saludos.
Walter.
Diego Calderon
Ago 21, 2015 @ 00:07:29
hola walter.. de nuevo gracias por tu tiempo..pero fijate que cuando la corro esde excel me sale un error que dice token unknown LEFT..
no se que hacer..sera que puedo enviarte por correo la BD para que puedas mirar el campo de esa tabla?
gracias
Diego