2012-07-05 80 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 

    )