sql - transponer - pivot oracle columns to rows
¿Cómo puedo obtener los nombres de las columnas de una tabla en Oracle? (26)
Consulta para seleccionar detalles de columna en SQL 2008
DECLARE @tableName varchar(20)=''item''
SELECT UPPER(COLUMN_NAME)columnname
,DATA_TYPE+(CASE DATA_TYPE WHEN ''numeric'' THEN ''(''+CAST(NUMERIC_PRECISION AS varchar)+'',''+CAST(NUMERIC_PRECISION_RADIX AS varchar)+'')''
WHEN ''varchar'' THEN ''(''+CAST(CHARACTER_MAXIMUM_LENGTH AS varchar)+'')''
ELSE '''' END)
,''DECLARE @''+COLUMN_NAME+'' ''+DATA_TYPE+(CASE DATA_TYPE WHEN ''numeric'' THEN ''(''+CAST(NUMERIC_PRECISION AS varchar)+'',''+CAST(NUMERIC_PRECISION_RADIX AS varchar)+'')''
WHEN ''varchar'' THEN ''(''+CAST(CHARACTER_MAXIMUM_LENGTH AS varchar)+'')''
ELSE '''' END) Declaration
,''@''+ UPPER(COLUMN_NAME)+'' ''+DATA_TYPE+(CASE DATA_TYPE WHEN ''numeric'' THEN ''(''+CAST(NUMERIC_PRECISION AS varchar)+'',''+CAST(NUMERIC_PRECISION_RADIX AS varchar)+'')''
WHEN ''varchar'' THEN ''(''+CAST(CHARACTER_MAXIMUM_LENGTH AS varchar)+'')''
ELSE '''' END)+'','' XMLDeclare
,''@''+COLUMN_NAME+'','' Assign
,COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_PRECISION_RADIX
Necesito consultar la base de datos para obtener los nombres de las columnas , para no confundirlos con los datos de la tabla. Por ejemplo, si tengo una tabla llamada EVENT_LOG
que contiene eventID
, eventType
, eventDesc
y eventTime
, entonces quisiera recuperar esos nombres de campo de la consulta y nada más.
Encontré cómo hacer esto en:
- Microsoft SQL Server
- MySQL
- PostgreSQL
Pero necesito saber: ¿cómo se puede hacer esto en Oracle ?
En Oracle, hay dos vistas que describen columnas:
DBA_TAB_COLUMNS describe las columnas de todas las tablas, vistas y clústeres en la base de datos.
USER_TAB_COLUMNS describe las columnas de las tablas, vistas y
clusters propiedad del usuario actual. Esta vista no muestra el
Columna PROPIETARIO.
En SQL Server ...
SELECT [name] AS [Column Name]
FROM syscolumns
WHERE id = (SELECT id FROM sysobjects WHERE type = ''V'' AND [Name] = ''Your table name'')
Tipo = ''V'' para vistas Tipo = ''U'' para tablas
Esa información se almacena en la tabla del sistema ALL_TAB_COLUMNS
:
SQL> select column_name from all_tab_columns where table_name = ''DUAL'';
DUMMY
O podría DESCRIBE
la tabla si está usando SQL * PLUS:
SQL> desc dual
Name Null? Type
----------------------------------------------------- -------- ---------------------- -------------
DUMMY VARCHAR2(1)
Incluso esta es también una de las maneras en que podemos usarla
select * from product where 1 != 1
La respuesta está aquí: http://php.net/manual/en/function.mysql-list-fields.php Usaría el siguiente código en su caso:
$result = mysql_query("SHOW COLUMNS FROM sometable");
if (!$result) {
echo ''Could not run query: '' . mysql_error();
exit;
}
$fields = array();
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
$fields[] = $row[''Field''];
}
}
Las otras respuestas respondieron suficientemente la pregunta, pero pensé que compartiría algo de información adicional. Otros describen la sintaxis "DESCRIBE tabla" para obtener la información de la tabla. Si desea obtener la información en el mismo formato, pero sin utilizar DESCRIBE, puede hacer:
SELECT column_name as COLUMN_NAME, nullable || '' '' as BE_NULL,
SUBSTR(data_type || ''('' || data_length || '')'', 0, 10) as TYPE
FROM all_tab_columns WHERE table_name = ''TABLENAME'';
Probablemente no importe mucho, pero lo escribí antes y parece encajar.
Lo hice así
SELECT
TOP 0
*
FROM
Posts
¡Funciona incluso en http://data.stackexchange.com cuyas tablas de servicio no conozco!
Me encontré con esta pregunta buscando acceso a los nombres de columna en Teradata, así que agregaré la respuesta para su ''sabor'' de SQL:
SELECT ColumnName
FROM DBC.Columns
WHERE DatabaseName=''DBASE_NAME''
AND TableName=''TABLE_NAME'';
La información se almacena en DBC dbase.
Obtener tipos de datos es un poco más complicado: obtener el tipo de columna usando las tablas del sistema teradata
Mysql
SHOW COLUMNS FROM a_table_named_users WHERE Field REGEXP ''user_id|user_name|user_pass''
Esto devolverá un resultado como este:
Field | Type | Null | Key | Default | Extra
user_id int(8) NO PRI NULL auto_increment
user_name varchar(64) NO MUL NULL
user_pass varchar(64) NO NULL
Luego, para extraer los valores, puede simplemente
fetch row[0]
Esto también es excelente para pasar datos dinámicos ya que el REGEXP necesita el ''|'' para entradas múltiples, pero también es una forma de mantener los datos separados y fácil de almacenar / pasar a clases / funciones.
Intente incluir datos ficticios también para seguridad al enviarlos y compare lo que se devolvió al recibir cualquier error.
Para MySQL, use
SELECT column_name
FROM information_schema.columns
WHERE
table_schema = ''Schema'' AND table_name = ''Table_Name''
Para Oracle
SELECT column_name FROM user_tab_cols WHERE table_name=UPPER(''tableName'');
Para SQL Server 2008, podemos usar information_schema.columns para obtener información de columna
SELECT *
FROM information_schema.columns
WHERE table_name = ''Table_Name''
ORDER BY ordinal_position
Para SQL Server:
SELECT [name] AS [Column Name]
FROM syscolumns
WHERE id = object_id(''TABLE_NAME'')
Para SQLite, creo que puede usar algo como lo siguiente:
PRAGMA table_info(table-name);
Explicación de sqlite.org:
Este pragma devuelve una fila para cada columna en la tabla nombrada. Las columnas en el conjunto de resultados incluyen el nombre de la columna, el tipo de datos, si la columna puede ser NULL o no, y el valor predeterminado para la columna. La columna "pk" en el conjunto de resultados es cero para las columnas que no son parte de la clave principal, y es el índice de la columna en la clave principal para las columnas que forman parte de la clave principal.
Ver también: Sqlite.org Pragma Table Info
Prueba esto
select * from sys.all_columns c join sys.objects o on c.object_id=o.object_id where o.name = ''TABLENAME'' and c.name like ''%COLUMN NAME%''
Puede consultar la tabla USER_TAB_COLUMNS para los metadatos de la columna de la tabla.
SELECT table_name, column_name, data_type, data_length
FROM USER_TAB_COLUMNS
WHERE table_name = ''MYTABLE''
Puedes hacerlo:
describe EVENT_LOG
o
desc EVENT_LOG
Nota: solo aplicable si conoce el nombre de la tabla y específicamente para Oracle.
Simplemente seleccione la primera fila de la tabla, para el oráculo: select * from <table name> where rownum = 1;
También puede intentar esto, pero podría ser más información de la que necesita:
sp_columns TABLE_NAME
puedes ejecutar esta consulta
SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE ''%%'' --if you want to find specific column write here
ORDER BY schema_name, table_name;
SELECT A.COLUMN_NAME, A.* FROM all_tab_columns a
WHERE table_name = ''Your Table Name''
AND A.COLUMN_NAME = ''COLUMN NAME'' AND a.owner = ''Schema''
SELECT COLUMN_NAME
FROM YourDatabase.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ''YourTableName''
SELECT COLUMN_NAME ''all_columns''
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME=''user'';
describe YOUR_TABLE;
En tu caso :
describe EVENT_LOG;
select column_name,* from information_schema.columns
where table_name = ''YourTableName''
order by ordinal_position