2012-07-05 47 views
3

我需要一个查询找到BigQuery中的表格列的名称,如下面的查询在SQL:的BigQuery查询查找表的列名

SELECT column_name,data_type,data_length,data_precision,nullable FROM all_tab_cols where table_name ='EMP'; 

回答

1

它目前无法检索表的元数据(即列名和类型),但这不是第一次被请求。

是否有一个原因,你需要做这个查询?表元数据可通过tables API获取。

+0

感谢克雷格,表API是足以让我拿到表的元数据。 – user1487985

+0

我个人希望这可以作为一个查询来完成的原因是因为这就是我的项目之前一直在做的事情,在移动所有内容的过程中必须学习和转换的功能更少。 –

0

实际上,使用SQL可以这样做。为此,您需要查询日志记录表以获取正在创建的特定表的最后一个日志。

例如,假设正装表/每天创建:

CREATE TEMP FUNCTION jsonSchemaStringToArray(jsonSchema String) 
      RETURNS ARRAY<STRING> AS ((
      SELECT 
       SPLIT(
       REGEXP_REPLACE(REPLACE(LTRIM(jsonSchema,'{ '),'"fields": [',''), r'{[^{]+"name": "([^\"]+)"[^}]+}[, ]*', '\\1,') 
       ,',') 
     )); 
    WITH valid_schema_columns AS (
     WITH array_output aS (SELECT 
     jsonSchemaStringToArray(jsonSchema) AS column_names 
     FROM (
     SELECT 
      protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.load.schemaJson AS jsonSchema 
      , ROW_NUMBER() OVER (ORDER BY metadata.timestamp DESC) AS record_count 
     FROM `realself-main.bigquery_logging.cloudaudit_googleapis_com_data_access_20170101` 
     WHERE 
      protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.load.destinationTable.tableId = '<table_name>' 
      AND 
      protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.load.destinationTable.datasetId = '<schema_name>' 
      AND 
      protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.load.createDisposition = 'CREATE_IF_NEEDED' 
    ) AS t 
     WHERE 
     t.record_count = 1 -- grab the latest entry 
    ) 
     -- this is actually what UNNESTS the array into standard rows 
     SELECT 
     valid_column_name 
     FROM array_output 
     LEFT JOIN UNNEST(column_names) AS valid_column_name 

    )