2012-06-08 17 views
6

tengo una tabla llamada datas y estoy ejecutando una consulta como esta:¿Cómo obtener la extensión de archivo del archivo como resultado de la consulta SQL?

SELECT linkurl AS DOWNLOADURL, 
     lastrevlevel AS VERSION, 
     code AS DESCRIPTION, 
     created AS RELEASEDATE, 
     name AS TYPE 
FROM datas 
WHERE id IN (SELECT child_id 
      FROM datas _datas 
      WHERE parent_id = (SELECT Max(id) 
           FROM datas 
           WHERE code = 'AN4307SW')) 

Devuelve resultados como este:

DOWNLOADURL    VERSION DESCRIPTION RELEASEDATE TYPE 
/artifacts/download.txt 2.0  images  25/6/12  download.txt 

En la columna de la Type estoy geting nombre del archivo. Necesito obtener la extensión de archivo del nombre del archivo en la columna Type. ¿Cómo puedo conseguir esto?

Ejemplos:

TYPE 
.txt 
.pdf 
.xls 
+0

¿Estás usando php? –

+2

¿Qué esperarías que sucediera si tuviera un archivo llamado 'Test.Document.doc'? ¿Qué pasa si no se especificó una extensión? – Bridge

+0

@bridge quiero solo la extensión del nombre de archivo – anto

Respuesta

16

Puede utilizar SUBSTRING_INDEX. De esta manera:

select linkurl as DOWNLOADURL,lastrevlevel as VERSION, 
code as DESCRIPTION,created as RELEASEDATE, 
SUBSTRING_INDEX(name,'.',-1) as TYPE 
from datas where id in 
(select child_id from datas _datas 
where parent_id=(select max(id) from datas 
where code = 'AN4307SW')) 

EDITAR

Si ves los documentos sobre esta función Creo que esto se aplicará también a sus requerimientos.

Devuelve la subcadena de cadena str antes de contar las apariciones del delimitador . Si el recuento es positivo, se devuelve todo a la izquierda del delimitador final (contando desde la izquierda). Si el recuento es negativo, se devuelve todo a la derecha del delimitador final (contando desde la derecha). SUBSTRING_INDEX() realiza una coincidencia con mayúsculas y minúsculas al buscar delim.

Esto también se encargará de un caso como este:

select SUBSTRING_INDEX('Test.Document.doc','.',-1); 

Edit2

Si se utiliza Oracle. Por favor marque la pregunta en el asunto correcto la próxima vez. No hay SUBSTRING_INDEX en el oráculo. Pero lo que puedo ver que puede hacer esto muy fácil:

SELECT SUBSTR('Test.Document.doc', INSTR('Test.Document.doc', '.',-1)) 
FROM dual; 

consulta completa de esta manera:

select linkurl as DOWNLOADURL,lastrevlevel as VERSION, 
    code as DESCRIPTION,created as RELEASEDATE, 
    SUBSTR(name, INSTR(name, '.',-1)) as TYPE 
    from datas where id in 
    (select child_id from datas _datas 
    where parent_id=(select max(id) from datas 
    where code = 'AN4307SW')) 

Referencia here

+0

pero cuando ejecuto esta consulta muestra el identificador no válido SUBSTRING_INDEX ... estoy usando oracle – anto

+0

@anto en las etiquetas Mencionaste mysql. –

+0

Se ha actualizado la respuesta – Arion

2
select linkurl as DOWNLOADURL,lastrevlevel as VERSION, 
code as DESCRIPTION,created as RELEASEDATE,reverse(substring(reverse(name), 1,charindex('.', reverse(name))-1)) as TYPE 
from datas where id in 
(select child_id from datas _datas 
where parent_id=(select max(id) from datas 
where code = 'AN4307SW')) 
+0

... acabo de probar que esta solución funciona bien, también cubre situaciones en las que un nombre de archivo podría ser así: 'algo.txt.txt' –

+0

@rohan, sí :) –

0

cree que necesitará algo como esto

SELECT REPLACE(name,SUBSTRING(name ,0, CHARINDEX('.', name)),'') 
+0

seleccione REVERSE (SUBSTRING (REVERSE (nombre), 1, LOCATE ('.', REVERSE (nombre), 1))) – mansi

+0

Quiero publicarlo como otro ans pero se publica como comentario aquí erróneamente. pero ¿cómo elimino este comentario? no hay opción para eliminar – mansi

0
SELECT 
    SUBSTRING(file_name,(LENGTH(file_name)-LOCATE('.',REVERSE(file_name)))+2) 
FROM <table name> WHERE file_id=<file_id>; 
0
SELECT REVERSE(SUBSTRING(REVERSE(name),1,LOCATE('.',REVERSE(name),1‌​))); 
Cuestiones relacionadas