הרצת שאילתות שמכילות פרמטרים

כשמריצים שאילתות על נתונים ב-BigQuery באמצעות תחביר GoogleSQL, אפשר להשתמש בפרמטרים כדי להגן על שאילתות שנוצרות מקלט של משתמשים מפני הזרקת SQL. הפרמטרים מחליפים ביטויים שרירותיים בשאילתות GoogleSQL.

מעבירים פרמטרים של שאילתות לסוגים שונים של נתונים, כולל:

  • מערכים
  • חותמות זמן
  • Structs
  • טווחים

העברת פרמטר בשאילתה

פרמטרים של שאילתה נתמכים רק בתחביר GoogleSQL. אי אפשר להשתמש בפרמטרים במקום מזהים, שמות עמודות, שמות טבלאות או חלקים אחרים של השאילתה.

כדי לציין פרמטר עם שם, משתמשים בתו @ ואחריו במזהה, כמו @param_name. לחלופין, אפשר להשתמש בערך הפלייסהולדר ? כדי לציין פרמטר מיקום. שאילתה יכולה להשתמש בפרמטרים מיקומיים או בפרמטרים עם שם, אבל לא בשניהם.

אפשר להריץ שאילתה שמכילה פרמטרים ב-BigQuery באופנים הבאים:

  • עורך השאילתות של BigQuery Studio במסוף Google Cloud
  • הפקודה bq query בכלי שורת הפקודה bq
  • ‫API
  • ספריות הלקוח

בדוגמאות הבאות מוצג איך להעביר ערכי פרמטרים לשאילתה עם פרמטרים:

המסוף

כדי להריץ שאילתה עם פרמטרים במסוף Google Cloud , מגדירים פרמטרים בהגדרות השאילתה, ואז מפנים אליהם בשאילתת ה-SQL על ידי הוספת התו @ לפני כל שם פרמטר.

סוגי נתונים נתמכים: מסוף Google Cloud תומך רק בשאילתות עם פרמטרים של סוגי נתונים פרימיטיביים, כמו BIGNUMERIC,‏ BOOL,‏ BYTES,‏ DATE,‏ DATETIME,‏ FLOAT64,‏ GEOGRAPHY,‏ INT64,‏ INTERVAL,‏ NUMERIC,‏ STRING,‏ TIME או TIMESTAMP. סוגי נתונים מורכבים, כמו ARRAY ו-STRUCT, לא נתמכים במסוף Google Cloud .

הוספת הפרמטרים במסוף Google Cloud

  1. עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. בסרגל הכלים של עורך השאילתות, לוחצים על עוד ובוחרים באפשרות הגדרות השאילתה.

  3. בחלונית הגדרות שאילתה, מאתרים את הקטע פרמטרים של שאילתה ולוחצים על הוספת פרמטר.

  4. לכל פרמטר בשאילתה, צריך לציין את הפרטים הבאים:

    • שם: מזינים את שם הפרמטר (לא כוללים את התו @).
    • סוג: בוחרים את סוג הנתונים של הפרמטר.
    • ערך: מזינים את הערך שרוצים להשתמש בו בהפעלה הזו.
  5. לוחצים על Save.

העברת ערכי פרמטרים לשאילתה במסוף Google Cloud

  1. בעורך השאילתות, מזינים שאילתת SQL באמצעות הפרמטרים שהגדרתם בשלב הקודם. כדי להפנות אליהם, מוסיפים את התו @ לפני השמות שלהם, כמו בדוגמה.

    לדוגמה:

    SELECT
        word,
        word_count
      FROM
        `bigquery-public-data.samples.shakespeare`
      WHERE
        corpus = @corpus
      AND
        word_count >= @min_word_count
      ORDER BY
        word_count DESC;
    

    בדוגמה הזו, מוסיפים את הפרמטר corpus כ-STRING עם הערך romeoandjuliet, ואת הפרמטר min_word_count כ-INT64 עם הערך 250.

    אם השאילתה מכילה פרמטר חסר או לא תקין, תוצג הודעת שגיאה. לוחצים על הגדרת פרמטר בהודעת השגיאה כדי לשנות את הגדרות הפרמטר.

  2. כדי להריץ את השאילתה עם הפרמטרים בעורך השאילתות, לוחצים על הפעלה.

BQ

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. משתמשים ב---parameter כדי לספק ערכים לפרמטרים בפורמט name:type:value. שם ריק יוצר פרמטר מיקום. אפשר להשמיט את הסוג כדי להניח STRING.

    צריך להשתמש בדגל --parameter בשילוב עם הדגל --use_legacy_sql=false כדי לציין את התחביר של GoogleSQL.

    (אופציונלי) מציינים את המיקום באמצעות הדגל --location.

    bq query \
       --use_legacy_sql=false \
       --parameter=corpus::romeoandjuliet \
       --parameter=min_word_count:INT64:250 \
       'SELECT
         word,
         word_count
       FROM
         `bigquery-public-data.samples.shakespeare`
       WHERE
         corpus = @corpus
       AND
         word_count >= @min_word_count
       ORDER BY
         word_count DESC;'
  3. API

    כדי להשתמש בפרמטרים עם שמות, צריך להגדיר את parameterMode ל-NAMED בהגדרות של משימת query.

    מאכלסים את queryParameters ברשימת הפרמטרים בהגדרת המשימה query. מגדירים את name של כל פרמטר באמצעות @param_name שמשמש בשאילתה.

    מפעילים את תחביר GoogleSQL על ידי הגדרת useLegacySql לערך false.

    {
      "query": "SELECT word, word_count FROM `bigquery-public-data.samples.shakespeare` WHERE corpus = @corpus AND word_count >= @min_word_count ORDER BY word_count DESC;",
      "queryParameters": [
        {
          "parameterType": {
            "type": "STRING"
          },
          "parameterValue": {
            "value": "romeoandjuliet"
          },
          "name": "corpus"
        },
        {
          "parameterType": {
            "type": "INT64"
          },
          "parameterValue": {
            "value": "250"
          },
          "name": "min_word_count"
        }
      ],
      "useLegacySql": false,
      "parameterMode": "NAMED"
    }
    

    לניסיון ב-Google APIs Explorer

    כדי להשתמש בפרמטרים מיקומיים, צריך להגדיר את parameterMode ל-POSITIONAL בהגדרת המשימה query.

    C#‎

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי C#הוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery C# API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    כדי להשתמש בפרמטרים עם שמות:
    
    using Google.Cloud.BigQuery.V2;
    using System;
    
    public class BigQueryQueryWithNamedParameters
    {
        public void QueryWithNamedParameters(string projectId = "your-project-id")
        {
            var corpus = "romeoandjuliet";
            var minWordCount = 250;
    
            // Note: Standard SQL is required to use query parameters.
            var query = @"
                SELECT word, word_count
                FROM `bigquery-public-data.samples.shakespeare`
                WHERE corpus = @corpus
                AND word_count >= @min_word_count
                ORDER BY word_count DESC";
    
            // Initialize client that will be used to send requests.
            var client = BigQueryClient.Create(projectId);
    
            var parameters = new BigQueryParameter[]
            {
                new BigQueryParameter("corpus", BigQueryDbType.String, corpus),
                new BigQueryParameter("min_word_count", BigQueryDbType.Int64, minWordCount)
            };
    
            var job = client.CreateQueryJob(
                sql: query,
                parameters: parameters,
                options: new QueryOptions { UseQueryCache = false });
            // Wait for the job to complete.
            job = job.PollUntilCompleted().ThrowOnAnyError();
            // Display the results
            foreach (BigQueryRow row in client.GetQueryResults(job.Reference))
            {
                Console.WriteLine($"{row["word"]}: {row["word_count"]}");
            }
        }
    }

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי C#הוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery C# API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    כדי להשתמש בפרמטרים מיקומיים:
    
    using Google.Cloud.BigQuery.V2;
    using System;
    
    public class BigQueryQueryWithPositionalParameters
    {
        public void QueryWithPositionalParameters(string projectId = "project-id")
        {
            var corpus = "romeoandjuliet";
            var minWordCount = 250;
    
            // Note: Standard SQL is required to use query parameters.
            var query = @"
                    SELECT word, word_count
                    FROM `bigquery-public-data.samples.shakespeare`
                    WHERE corpus = ?
                    AND word_count >= ?
                    ORDER BY word_count DESC;";
    
            // Initialize client that will be used to send requests.
            var client = BigQueryClient.Create(projectId);
    
            // Set the name to None to use positional parameters.
            // Note that you cannot mix named and positional parameters.
            var parameters = new BigQueryParameter[]
            {
                new BigQueryParameter(null, BigQueryDbType.String, corpus),
                new BigQueryParameter(null, BigQueryDbType.Int64, minWordCount)
            };
    
            var job = client.CreateQueryJob(
                sql: query,
                parameters: parameters,
                options: new QueryOptions
                {
                    UseQueryCache = false,
                    ParameterMode = BigQueryParameterMode.Positional
                });
            // Wait for the job to complete.
            job = job.PollUntilCompleted().ThrowOnAnyError();
            // Display the results
            foreach (BigQueryRow row in client.GetQueryResults(job.Reference))
            {
                Console.WriteLine($"{row["word"]}: {row["word_count"]}");
            }
        }
    }

    Go

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Goהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Go API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    כדי להשתמש בפרמטרים עם שמות:
    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/bigquery"
    	"google.golang.org/api/iterator"
    )
    
    // queryWithNamedParams demonstrate issuing a query using named query parameters.
    func queryWithNamedParams(w io.Writer, projectID string) error {
    	// projectID := "my-project-id"
    	ctx := context.Background()
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %v", err)
    	}
    	defer client.Close()
    
    	q := client.Query(
    		`SELECT word, word_count
            FROM ` + "`bigquery-public-data.samples.shakespeare`" + `
            WHERE corpus = @corpus
            AND word_count >= @min_word_count
            ORDER BY word_count DESC;`)
    	q.Parameters = []bigquery.QueryParameter{
    		{
    			Name:  "corpus",
    			Value: "romeoandjuliet",
    		},
    		{
    			Name:  "min_word_count",
    			Value: 250,
    		},
    	}
    	// Run the query and print results when the query job is completed.
    	job, err := q.Run(ctx)
    	if err != nil {
    		return err
    	}
    	status, err := job.Wait(ctx)
    	if err != nil {
    		return err
    	}
    	if err := status.Err(); err != nil {
    		return err
    	}
    	it, err := job.Read(ctx)
    	for {
    		var row []bigquery.Value
    		err := it.Next(&row)
    		if err == iterator.Done {
    			break
    		}
    		if err != nil {
    			return err
    		}
    		fmt.Fprintln(w, row)
    	}
    	return nil
    }
    

    כדי להשתמש בפרמטרים מיקומיים:
    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/bigquery"
    	"google.golang.org/api/iterator"
    )
    
    // queryWithPostionalParams demonstrate issuing a query using positional query parameters.
    func queryWithPositionalParams(w io.Writer, projectID string) error {
    	// projectID := "my-project-id"
    	ctx := context.Background()
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %v", err)
    	}
    	defer client.Close()
    
    	q := client.Query(
    		`SELECT word, word_count
            FROM ` + "`bigquery-public-data.samples.shakespeare`" + `
            WHERE corpus = ?
            AND word_count >= ?
            ORDER BY word_count DESC;`)
    	q.Parameters = []bigquery.QueryParameter{
    		{
    			Value: "romeoandjuliet",
    		},
    		{
    			Value: 250,
    		},
    	}
    	// Run the query and print results when the query job is completed.
    	job, err := q.Run(ctx)
    	if err != nil {
    		return err
    	}
    	status, err := job.Wait(ctx)
    	if err != nil {
    		return err
    	}
    	if err := status.Err(); err != nil {
    		return err
    	}
    	it, err := job.Read(ctx)
    	for {
    		var row []bigquery.Value
    		err := it.Next(&row)
    		if err == iterator.Done {
    			break
    		}
    		if err != nil {
    			return err
    		}
    		fmt.Fprintln(w, row)
    	}
    	return nil
    }
    

    Java

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Java API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    כדי להשתמש בפרמטרים עם שמות:
    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.QueryJobConfiguration;
    import com.google.cloud.bigquery.QueryParameterValue;
    import com.google.cloud.bigquery.TableResult;
    
    public class QueryWithNamedParameters {
    
      public static void queryWithNamedParameters() {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          String corpus = "romeoandjuliet";
          long minWordCount = 250;
          String query =
              "SELECT word, word_count\n"
                  + "FROM `bigquery-public-data.samples.shakespeare`\n"
                  + "WHERE corpus = @corpus\n"
                  + "AND word_count >= @min_word_count\n"
                  + "ORDER BY word_count DESC";
    
          // Note: Standard SQL is required to use query parameters.
          QueryJobConfiguration queryConfig =
              QueryJobConfiguration.newBuilder(query)
                  .addNamedParameter("corpus", QueryParameterValue.string(corpus))
                  .addNamedParameter("min_word_count", QueryParameterValue.int64(minWordCount))
                  .build();
    
          TableResult results = bigquery.query(queryConfig);
    
          results
              .iterateAll()
              .forEach(row -> row.forEach(val -> System.out.printf("%s,", val.toString())));
    
          System.out.println("Query with named parameters performed successfully.");
        } catch (BigQueryException | InterruptedException e) {
          System.out.println("Query not performed \n" + e.toString());
        }
      }
    }

    כדי להשתמש בפרמטרים מיקומיים:
    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.QueryJobConfiguration;
    import com.google.cloud.bigquery.QueryParameterValue;
    import com.google.cloud.bigquery.TableResult;
    
    public class QueryWithPositionalParameters {
      public static void queryWithPositionalParameters() {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          String corpus = "romeoandjuliet";
          long minWordCount = 250;
          String query =
              "SELECT word, word_count\n"
                  + "FROM `bigquery-public-data.samples.shakespeare`\n"
                  + "WHERE corpus = ?\n"
                  + "AND word_count >= ?\n"
                  + "ORDER BY word_count DESC";
    
          // Note: Standard SQL is required to use query parameters.
          QueryJobConfiguration queryConfig =
              QueryJobConfiguration.newBuilder(query)
                  .addPositionalParameter(QueryParameterValue.string(corpus))
                  .addPositionalParameter(QueryParameterValue.int64(minWordCount))
                  .build();
    
          TableResult results = bigquery.query(queryConfig);
    
          results
              .iterateAll()
              .forEach(row -> row.forEach(val -> System.out.printf("%s,", val.toString())));
    
          System.out.println("Query with positional parameters performed successfully.");
        } catch (BigQueryException | InterruptedException e) {
          System.out.println("Query not performed \n" + e.toString());
        }
      }
    }

    Node.js

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Node.js API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    כדי להשתמש בפרמטרים עם שמות:
    // Run a query using named query parameters
    
    // Import the Google Cloud client library
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();
    
    async function queryParamsNamed() {
      // The SQL query to run
      const sqlQuery = `SELECT word, word_count
            FROM \`bigquery-public-data.samples.shakespeare\`
            WHERE corpus = @corpus
            AND word_count >= @min_word_count
            ORDER BY word_count DESC`;
    
      const options = {
        query: sqlQuery,
        // Location must match that of the dataset(s) referenced in the query.
        location: 'US',
        params: {corpus: 'romeoandjuliet', min_word_count: 250},
      };
    
      // Run the query
      const [rows] = await bigquery.query(options);
    
      console.log('Rows:');
      rows.forEach(row => console.log(row));
    }

    כדי להשתמש בפרמטרים מיקומיים:
    // Run a query using positional query parameters
    
    // Import the Google Cloud client library
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();
    
    async function queryParamsPositional() {
      // The SQL query to run
      const sqlQuery = `SELECT word, word_count
            FROM \`bigquery-public-data.samples.shakespeare\`
            WHERE corpus = ?
            AND word_count >= ?
            ORDER BY word_count DESC`;
    
      const options = {
        query: sqlQuery,
        // Location must match that of the dataset(s) referenced in the query.
        location: 'US',
        params: ['romeoandjuliet', 250],
      };
    
      // Run the query
      const [rows] = await bigquery.query(options);
    
      console.log('Rows:');
      rows.forEach(row => console.log(row));
    }

    Python

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Python API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    כדי להשתמש בפרמטרים עם שמות:
    from google.cloud import bigquery
    
    # Construct a BigQuery client object.
    client = bigquery.Client()
    
    query = """
        SELECT word, word_count
        FROM `bigquery-public-data.samples.shakespeare`
        WHERE corpus = @corpus
        AND word_count >= @min_word_count
        ORDER BY word_count DESC;
    """
    job_config = bigquery.QueryJobConfig(
        query_parameters=[
            bigquery.ScalarQueryParameter("corpus", "STRING", "romeoandjuliet"),
            bigquery.ScalarQueryParameter("min_word_count", "INT64", 250),
        ]
    )
    results = client.query_and_wait(
        query, job_config=job_config
    )  # Make an API request.
    
    for row in results:
        print("{}: \t{}".format(row.word, row.word_count))

    כדי להשתמש בפרמטרים מיקומיים:
    from google.cloud import bigquery
    
    # Construct a BigQuery client object.
    client = bigquery.Client()
    
    query = """
        SELECT word, word_count
        FROM `bigquery-public-data.samples.shakespeare`
        WHERE corpus = ?
        AND word_count >= ?
        ORDER BY word_count DESC;
    """
    # Set the name to None to use positional parameters.
    # Note that you cannot mix named and positional parameters.
    job_config = bigquery.QueryJobConfig(
        query_parameters=[
            bigquery.ScalarQueryParameter(None, "STRING", "romeoandjuliet"),
            bigquery.ScalarQueryParameter(None, "INT64", 250),
        ]
    )
    results = client.query_and_wait(
        query, job_config=job_config
    )  # Make an API request.
    
    for row in results:
        print("{}: \t{}".format(row.word, row.word_count))

שימוש במערכים בשאילתות עם פרמטרים

כדי להשתמש בסוג מערך בפרמטר של שאילתה, מגדירים את הסוג ל-ARRAY<T>, כאשר T הוא סוג הרכיבים במערך. יוצרים את הערך כרשימה של רכיבים שמופרדים בפסיקים ומוקפים בסוגריים מרובעים, כמו [1, 2, 3].

מידע נוסף על סוג המערך מופיע במאמר הפניה לסוגי נתונים.

המסוף

מערכים בשאילתות עם פרמטרים לא נתמכים במסוףGoogle Cloud .

BQ

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. השאילתה הזו בוחרת את השמות הפופולריים ביותר לתינוקות בנים שנולדו במדינות בארה"ב שמתחילות באות W:

    bq query \
       --use_legacy_sql=false \
       --parameter='gender::M' \
       --parameter='states:ARRAY<STRING>:["WA", "WI", "WV", "WY"]' \
       'SELECT
         name,
         SUM(number) AS count
       FROM
         `bigquery-public-data.usa_names.usa_1910_2013`
       WHERE
         gender = @gender
         AND state IN UNNEST(@states)
       GROUP BY
         name
       ORDER BY
         count DESC
       LIMIT
         10;'

    חשוב להקפיד להוסיף גרשיים בודדים להצהרה על סוג המערך, כדי שפלט הפקודה לא יופנה בטעות לקובץ על ידי התו >.

  3. API

    כדי להשתמש בפרמטר עם ערך מסוג מערך, צריך להגדיר את parameterType ל-ARRAY בהגדרת המשימה query.

    אם הערכים במערך הם סקלרים, צריך להגדיר את parameterType לסוג הערכים, למשל STRING. אם ערכי המערך הם מבנים, צריך להגדיר את הערך STRUCT ולהוסיף את הגדרות השדות הנדרשות ל-structTypes.

    לדוגמה, השאילתה הזו בוחרת את השמות הפופולריים ביותר לתינוקות בנים שנולדו במדינות בארה"ב שמתחילות באות W.

    {
     "query": "SELECT name, sum(number) as count\nFROM `bigquery-public-data.usa_names.usa_1910_2013`\nWHERE gender = @gender\nAND state IN UNNEST(@states)\nGROUP BY name\nORDER BY count DESC\nLIMIT 10;",
     "queryParameters": [
      {
       "parameterType": {
        "type": "STRING"
       },
       "parameterValue": {
        "value": "M"
       },
       "name": "gender"
      },
      {
       "parameterType": {
        "type": "ARRAY",
        "arrayType": {
         "type": "STRING"
        }
       },
       "parameterValue": {
        "arrayValues": [
         {
          "value": "WA"
         },
         {
          "value": "WI"
         },
         {
          "value": "WV"
         },
         {
          "value": "WY"
         }
        ]
       },
       "name": "states"
      }
     ],
     "useLegacySql": false,
     "parameterMode": "NAMED"
    }
    

    לניסיון ב-Google APIs Explorer

    C#‎

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי C#הוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery C# API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    
    using Google.Cloud.BigQuery.V2;
    using System;
    
    public class BigQueryQueryWithArrayParameters
    {
        public void QueryWithArrayParameters(string projectId = "your-project-id")
        {
            var gender = "M";
            string[] states = { "WA", "WI", "WV", "WY" };
    
            // Note: Standard SQL is required to use query parameters.
            var query = @"
                SELECT name, sum(number) as count
                FROM `bigquery-public-data.usa_names.usa_1910_2013`
                WHERE gender = @gender
                AND state IN UNNEST(@states)
                GROUP BY name
                ORDER BY count DESC
                LIMIT 10;";
    
            // Initialize client that will be used to send requests.
            var client = BigQueryClient.Create(projectId);
    
            var parameters = new BigQueryParameter[]
            {
                new BigQueryParameter("gender", BigQueryDbType.String, gender),
                new BigQueryParameter("states", BigQueryDbType.Array, states)
            };
    
            var job = client.CreateQueryJob(
                sql: query,
                parameters: parameters,
                options: new QueryOptions { UseQueryCache = false });
            // Wait for the job to complete.
            job = job.PollUntilCompleted().ThrowOnAnyError();
            // Display the results
            foreach (BigQueryRow row in client.GetQueryResults(job.Reference))
            {
                Console.WriteLine($"{row["name"]}: {row["count"]}");
            }
        }
    }

    Go

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Goהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Go API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/bigquery"
    	"google.golang.org/api/iterator"
    )
    
    // queryWithArrayParams demonstrates issuing a query and specifying query parameters that include an
    // array of strings.
    func queryWithArrayParams(w io.Writer, projectID string) error {
    	// projectID := "my-project-id"
    	ctx := context.Background()
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %v", err)
    	}
    	defer client.Close()
    
    	q := client.Query(
    		`SELECT
    			name,
    			sum(number) as count 
            FROM ` + "`bigquery-public-data.usa_names.usa_1910_2013`" + `
    		WHERE
    			gender = @gender
            	AND state IN UNNEST(@states)
    		GROUP BY
    			name
    		ORDER BY
    			count DESC
    		LIMIT 10;`)
    	q.Parameters = []bigquery.QueryParameter{
    		{
    			Name:  "gender",
    			Value: "M",
    		},
    		{
    			Name:  "states",
    			Value: []string{"WA", "WI", "WV", "WY"},
    		},
    	}
    	// Run the query and print results when the query job is completed.
    	job, err := q.Run(ctx)
    	if err != nil {
    		return err
    	}
    	status, err := job.Wait(ctx)
    	if err != nil {
    		return err
    	}
    	if err := status.Err(); err != nil {
    		return err
    	}
    	it, err := job.Read(ctx)
    	for {
    		var row []bigquery.Value
    		err := it.Next(&row)
    		if err == iterator.Done {
    			break
    		}
    		if err != nil {
    			return err
    		}
    		fmt.Fprintln(w, row)
    	}
    	return nil
    }
    

    Java

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Java API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.QueryJobConfiguration;
    import com.google.cloud.bigquery.QueryParameterValue;
    import com.google.cloud.bigquery.TableResult;
    
    // Sample to running a query with array query parameters.
    public class QueryWithArrayParameters {
    
      public static void runQueryWithArrayParameters() {
        String gender = "M";
        String[] states = {"WA", "WI", "WV", "WY"};
        String query =
            "SELECT name, sum(number) as count\n"
                + "FROM `bigquery-public-data.usa_names.usa_1910_2013`\n"
                + "WHERE gender = @gender\n"
                + "AND state IN UNNEST(@states)\n"
                + "GROUP BY name\n"
                + "ORDER BY count DESC\n"
                + "LIMIT 10;";
        queryWithArrayParameters(query, gender, states);
      }
    
      public static void queryWithArrayParameters(String query, String gender, String[] states) {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          // Note: Standard SQL is required to use query parameters.
          QueryJobConfiguration queryConfig =
              QueryJobConfiguration.newBuilder(query)
                  .addNamedParameter("gender", QueryParameterValue.string(gender))
                  .addNamedParameter("states", QueryParameterValue.array(states, String.class))
                  .build();
    
          TableResult results = bigquery.query(queryConfig);
    
          // Print the results.
          results
              .iterateAll()
              .forEach(row -> row.forEach(val -> System.out.printf("%s,", val.toString())));
          System.out.println("Query with arrays parameters performed successfully");
        } catch (BigQueryException | InterruptedException e) {
          System.out.println("Query not performed \n" + e.toString());
        }
      }
    }

    Node.js

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Node.js API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    // Run a query using array query parameters
    
    // Import the Google Cloud client library
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();
    
    async function queryParamsArrays() {
      // The SQL query to run
      const sqlQuery = `SELECT name, sum(number) as count
      FROM \`bigquery-public-data.usa_names.usa_1910_2013\`
      WHERE gender = @gender
      AND state IN UNNEST(@states)
      GROUP BY name
      ORDER BY count DESC
      LIMIT 10;`;
    
      const options = {
        query: sqlQuery,
        // Location must match that of the dataset(s) referenced in the query.
        location: 'US',
        params: {gender: 'M', states: ['WA', 'WI', 'WV', 'WY']},
      };
    
      // Run the query
      const [rows] = await bigquery.query(options);
    
      console.log('Rows:');
      rows.forEach(row => console.log(row));
    }

    Python

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Python API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    from google.cloud import bigquery
    
    # Construct a BigQuery client object.
    client = bigquery.Client()
    
    query = """
        SELECT name, sum(number) as count
        FROM `bigquery-public-data.usa_names.usa_1910_2013`
        WHERE gender = @gender
        AND state IN UNNEST(@states)
        GROUP BY name
        ORDER BY count DESC
        LIMIT 10;
    """
    job_config = bigquery.QueryJobConfig(
        query_parameters=[
            bigquery.ScalarQueryParameter("gender", "STRING", "M"),
            bigquery.ArrayQueryParameter("states", "STRING", ["WA", "WI", "WV", "WY"]),
        ]
    )
    rows = client.query_and_wait(query, job_config=job_config)  # Make an API request.
    
    for row in rows:
        print("{}: \t{}".format(row.name, row.count))

שימוש בחותמות זמן בשאילתות שמכילות פרמטרים

כדי להשתמש בחותמת זמן בפרמטר של שאילתה, ה-API הבסיסי בארכיטקטורת REST מקבל ערך מסוג TIMESTAMP בפורמט YYYY-MM-DD HH:MM:SS.DDDDDD time_zone. אם אתם משתמשים בספריות הלקוח, אתם יוצרים אובייקט תאריך מובנה בשפה הזו, והספרייה ממירה אותו לפורמט הנכון. מידע נוסף זמין בדוגמאות הבאות לפי שפה.

מידע נוסף על הסוג TIMESTAMP זמין במאמר בנושא סוגי נתונים.

המסוף

פועלים לפי השלבים להוספת פרמטרים במסוף Google Cloud שמתוארים בהמשך המאמר הזה. בוחרים באפשרות TIMESTAMP בשביל סוג הפרמטר ומזינים את ערך חותמת הזמן בפורמט YYYY-MM-DD HH:MM:SS.DDDDDD time_zone.

BQ

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. השאילתה הזו מוסיפה שעה לערך פרמטר חותמת הזמן:

    bq query \
       --use_legacy_sql=false \
       --parameter='ts_value:TIMESTAMP:2016-12-07 08:00:00' \
       'SELECT
         TIMESTAMP_ADD(@ts_value, INTERVAL 1 HOUR);'
  3. API

    כדי להשתמש בפרמטר של חותמת זמן, צריך להגדיר את הערך של parameterType ל-TIMESTAMP בהגדרות של עבודת השאילתה.

    השאילתה הזו מוסיפה שעה לערך הפרמטר של חותמת הזמן.

    {
      "query": "SELECT TIMESTAMP_ADD(@ts_value, INTERVAL 1 HOUR);",
      "queryParameters": [
        {
          "name": "ts_value",
          "parameterType": {
            "type": "TIMESTAMP"
          },
          "parameterValue": {
            "value": "2016-12-07 08:00:00"
          }
        }
      ],
      "useLegacySql": false,
      "parameterMode": "NAMED"
    }
    

    לניסיון ב-Google APIs Explorer

    C#‎

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי C#הוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery C# API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    
    using Google.Cloud.BigQuery.V2;
    using System;
    
    public class BigQueryQueryWithTimestampParameters
    {
        public void QueryWithTimestampParameters(string projectId = "project-id")
        {
            var timestamp = new DateTime(2016, 12, 7, 8, 0, 0, DateTimeKind.Utc);
    
            // Note: Standard SQL is required to use query parameters.
            var query = "SELECT TIMESTAMP_ADD(@ts_value, INTERVAL 1 HOUR);";
    
            // Initialize client that will be used to send requests.
            var client = BigQueryClient.Create(projectId);
    
            var parameters = new BigQueryParameter[]
            {
                new BigQueryParameter("ts_value", BigQueryDbType.Timestamp, timestamp),
            };
    
            var job = client.CreateQueryJob(
                sql: query,
                parameters: parameters,
                options: new QueryOptions { UseQueryCache = false });
            // Wait for the job to complete.
            job = job.PollUntilCompleted().ThrowOnAnyError();
            // Display the results
            foreach (BigQueryRow row in client.GetQueryResults(job.Reference))
            {
                Console.WriteLine(row[0]);
            }
        }
    }

    Go

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Goהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Go API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import (
    	"context"
    	"fmt"
    	"io"
    	"time"
    
    	"cloud.google.com/go/bigquery"
    	"google.golang.org/api/iterator"
    )
    
    // queryWithTimestampParam demonstrates issuing a query and supplying a timestamp query parameter.
    func queryWithTimestampParam(w io.Writer, projectID string) error {
    	// projectID := "my-project-id"
    	ctx := context.Background()
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %v", err)
    	}
    	defer client.Close()
    
    	q := client.Query(
    		`SELECT TIMESTAMP_ADD(@ts_value, INTERVAL 1 HOUR);`)
    	q.Parameters = []bigquery.QueryParameter{
    		{
    			Name:  "ts_value",
    			Value: time.Date(2016, 12, 7, 8, 0, 0, 0, time.UTC),
    		},
    	}
    	// Run the query and print results when the query job is completed.
    	job, err := q.Run(ctx)
    	if err != nil {
    		return err
    	}
    	status, err := job.Wait(ctx)
    	if err != nil {
    		return err
    	}
    	if err := status.Err(); err != nil {
    		return err
    	}
    	it, err := job.Read(ctx)
    	for {
    		var row []bigquery.Value
    		err := it.Next(&row)
    		if err == iterator.Done {
    			break
    		}
    		if err != nil {
    			return err
    		}
    		fmt.Fprintln(w, row)
    	}
    	return nil
    }
    

    Java

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Java API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.QueryJobConfiguration;
    import com.google.cloud.bigquery.QueryParameterValue;
    import com.google.cloud.bigquery.TableResult;
    import org.threeten.bp.LocalDateTime;
    import org.threeten.bp.ZoneOffset;
    import org.threeten.bp.ZonedDateTime;
    
    // Sample to running a query with timestamp query parameters.
    public class QueryWithTimestampParameters {
    
      public static void runQueryWithTimestampParameters() {
        queryWithTimestampParameters();
      }
    
      public static void queryWithTimestampParameters() {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          ZonedDateTime timestamp = LocalDateTime.of(2016, 12, 7, 8, 0, 0).atZone(ZoneOffset.UTC);
          String query = "SELECT TIMESTAMP_ADD(@ts_value, INTERVAL 1 HOUR);";
          // Note: Standard SQL is required to use query parameters.
          QueryJobConfiguration queryConfig =
              QueryJobConfiguration.newBuilder(query)
                  .addNamedParameter(
                      "ts_value",
                      QueryParameterValue.timestamp(
                          // Timestamp takes microseconds since 1970-01-01T00:00:00 UTC
                          timestamp.toInstant().toEpochMilli() * 1000))
                  .build();
    
          TableResult results = bigquery.query(queryConfig);
    
          results
              .iterateAll()
              .forEach(row -> row.forEach(val -> System.out.printf("%s", val.toString())));
    
          System.out.println("Query with timestamp parameter performed successfully.");
        } catch (BigQueryException | InterruptedException e) {
          System.out.println("Query not performed \n" + e.toString());
        }
      }
    }

    Node.js

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Node.js API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    // Run a query using timestamp parameters
    
    // Import the Google Cloud client library
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();
    
    async function queryParamsTimestamps() {
      // The SQL query to run
      const sqlQuery = `SELECT TIMESTAMP_ADD(@ts_value, INTERVAL 1 HOUR);`;
    
      const options = {
        query: sqlQuery,
        // Location must match that of the dataset(s) referenced in the query.
        location: 'US',
        params: {ts_value: new Date()},
      };
    
      // Run the query
      const [rows] = await bigquery.query(options);
    
      console.log('Rows:');
      rows.forEach(row => console.log(row.f0_));
    }

    Python

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Python API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import datetime
    
    from google.cloud import bigquery
    
    # Construct a BigQuery client object.
    client = bigquery.Client()
    
    query = "SELECT TIMESTAMP_ADD(@ts_value, INTERVAL 1 HOUR);"
    job_config = bigquery.QueryJobConfig(
        query_parameters=[
            bigquery.ScalarQueryParameter(
                "ts_value",
                "TIMESTAMP",
                datetime.datetime(2016, 12, 7, 8, 0, tzinfo=datetime.timezone.utc),
            )
        ]
    )
    results = client.query_and_wait(
        query, job_config=job_config
    )  # Make an API request.
    
    for row in results:
        print(row)

שימוש במבנים בשאילתות שמכילות פרמטרים

כדי להשתמש במבנה נתונים בפרמטר של שאילתה, מגדירים את הסוג ל-STRUCT<T>, כאשר T מגדיר את השדות והסוגים בתוך המבנה. הגדרות השדות מופרדות באמצעות פסיקים, והן מהצורה field_name TF, כאשר TF הוא סוג השדה. לדוגמה, STRUCT<x INT64, y STRING> מגדיר מבנה עם שדה בשם x מסוג INT64 ושדה שני בשם y מסוג STRING.

מידע נוסף על הסוג STRUCT זמין במאמר בנושא סוגי נתונים .

המסוף

המסוףGoogle Cloud לא תומך במבנים בשאילתות שמכילות פרמטרים.

BQ

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. השאילתה הפשוטה הזו מדגימה את השימוש בסוגים מובנים על ידי החזרת ערך הפרמטר:

    bq query \
       --use_legacy_sql=false \
       --parameter='struct_value:STRUCT<x INT64, y STRING>:{"x": 1, "y": "foo"}' \
       'SELECT
         @struct_value AS s;'
  3. API

    כדי להשתמש בפרמטר מסוג struct, צריך להגדיר את parameterType לערך STRUCT בהגדרות של עבודת השאילתה.

    מוסיפים אובייקט לכל שדה במבנה אל structTypes ב-queryParameters של המשרה. אם הערכים של המבנה הם סקלרים, צריך להגדיר את type לסוג הערכים, כמו STRING. אם ערכי המבנה הם מערכים, צריך להגדיר את הערך הזה כ-ARRAY ולהגדיר את השדה המקונן arrayType לסוג המתאים. אם ערכי ה-struct הם מבנים, מגדירים את type ל-STRUCT ומוסיפים את structTypes הנדרש.

    השאילתה הפשוטה הזו מדגימה את השימוש בסוגים מובנים על ידי החזרת ערך הפרמטר.

    {
      "query": "SELECT @struct_value AS s;",
      "queryParameters": [
        {
          "name": "struct_value",
          "parameterType": {
            "type": "STRUCT",
            "structTypes": [
              {
                "name": "x",
                "type": {
                  "type": "INT64"
                }
              },
              {
                "name": "y",
                "type": {
                  "type": "STRING"
                }
              }
            ]
          },
          "parameterValue": {
            "structValues": {
              "x": {
                "value": "1"
              },
              "y": {
                "value": "foo"
              }
            }
          }
        }
      ],
      "useLegacySql": false,
      "parameterMode": "NAMED"
    }
    

    לניסיון ב-Google APIs Explorer

    C#‎

    ספריית הלקוח BigQuery ל-‎ .NET לא תומכת בפרמטרים של struct.

    Go

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Goהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Go API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/bigquery"
    	"google.golang.org/api/iterator"
    )
    
    // queryWithStructParam demonstrates running a query and providing query parameters that include struct
    // types.
    func queryWithStructParam(w io.Writer, projectID string) error {
    	// projectID := "my-project-id"
    	ctx := context.Background()
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %v", err)
    	}
    	defer client.Close()
    
    	type MyStruct struct {
    		X int64
    		Y string
    	}
    	q := client.Query(
    		`SELECT @struct_value as s;`)
    	q.Parameters = []bigquery.QueryParameter{
    		{
    			Name:  "struct_value",
    			Value: MyStruct{X: 1, Y: "foo"},
    		},
    	}
    	// Run the query and print results when the query job is completed.
    	job, err := q.Run(ctx)
    	if err != nil {
    		return err
    	}
    	status, err := job.Wait(ctx)
    	if err != nil {
    		return err
    	}
    	if err := status.Err(); err != nil {
    		return err
    	}
    	it, err := job.Read(ctx)
    	for {
    		var row []bigquery.Value
    		err := it.Next(&row)
    		if err == iterator.Done {
    			break
    		}
    		if err != nil {
    			return err
    		}
    		fmt.Fprintln(w, row)
    	}
    	return nil
    }
    

    Java

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Java API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.QueryJobConfiguration;
    import com.google.cloud.bigquery.QueryParameterValue;
    import com.google.cloud.bigquery.TableResult;
    import java.util.HashMap;
    import java.util.Map;
    
    public class QueryWithStructsParameters {
    
      public static void queryWithStructsParameters() {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          // Create struct
          Map<String, QueryParameterValue> struct = new HashMap<>();
          struct.put("booleanField", QueryParameterValue.bool(true));
          struct.put("integerField", QueryParameterValue.string("test-stringField"));
          struct.put("stringField", QueryParameterValue.int64(10));
          QueryParameterValue recordValue = QueryParameterValue.struct(struct);
    
          String query = "SELECT STRUCT(@recordField) AS record";
          QueryJobConfiguration queryConfig =
              QueryJobConfiguration.newBuilder(query)
                  .setUseLegacySql(false)
                  .addNamedParameter("recordField", recordValue)
                  .build();
    
          TableResult results = bigquery.query(queryConfig);
    
          results
              .iterateAll()
              .forEach(row -> row.forEach(val -> System.out.printf("%s", val.toString())));
    
          System.out.println("Query with struct parameter performed successfully.");
        } catch (BigQueryException | InterruptedException e) {
          System.out.println("Query not performed \n" + e.toString());
        }
      }
    }

    Node.js

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Node.js API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    // Run a query using struct query parameters
    
    // Import the Google Cloud client library
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();
    
    async function queryParamsStructs() {
      // The SQL query to run
      const sqlQuery = `SELECT @struct_value AS struct_obj;`;
    
      const options = {
        query: sqlQuery,
        // Location must match that of the dataset(s) referenced in the query.
        location: 'US',
        params: {struct_value: {x: 1, y: 'foo'}},
      };
    
      // Run the query
      const [rows] = await bigquery.query(options);
    
      console.log('Rows:');
      rows.forEach(row => console.log(row.struct_obj.y));
    }

    Python

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Python API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    from google.cloud import bigquery
    
    # Construct a BigQuery client object.
    client = bigquery.Client()
    
    query = "SELECT @struct_value AS s;"
    job_config = bigquery.QueryJobConfig(
        query_parameters=[
            bigquery.StructQueryParameter(
                "struct_value",
                bigquery.ScalarQueryParameter("x", "INT64", 1),
                bigquery.ScalarQueryParameter("y", "STRING", "foo"),
            )
        ]
    )
    results = client.query_and_wait(
        query, job_config=job_config
    )  # Make an API request and waits for results.
    
    for row in results:
        print(row.s)

שימוש בטווחים בשאילתות שמכילות פרמטרים

כדי להשתמש בטווח בפרמטר של שאילתה, מגדירים את השדה type לערך RANGE.

מידע נוסף על הסוג RANGE זמין במאמר בנושא סוגי נתונים .

המסוף

המסוףGoogle Cloud לא תומך בטווחים בשאילתות שמכילות פרמטרים.

BQ

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. בדוגמה הזו לשאילתה מוצג שימוש בסוגי טווחים. השאילתה מחזירה את ערך הפרמטר:

    bq query \
       --use_legacy_sql=false \
       --parameter='my_param:RANGE<DATE>:[2020-01-01, 2020-12-31)' \
       'SELECT @my_param AS foo;'
  3. API

    כדי להשתמש בפרמטר של טווח, בשדה parameterType מגדירים את השדה type לערך RANGE ואת השדה rangeElementType לסוג הטווח שרוצים להשתמש בו.

    השאילתה הזו מראה איך להשתמש בפרמטר RANGE כדי להחזיר את ערך הפרמטר.

    {
      "query": "SELECT @my_param AS value_of_range_parameter;",
      "queryParameters": [
        {
          "name": "range_param",
          "parameterType": {
            "type": "RANGE",
            "rangeElementTYpe": {
              "type": "DATE"
            }
          },
          "parameterValue": {
            "rangeValue": {
              "start": {
                "value": "2020-01-01"
              },
              "end": {
                "value": "2020-12-31"
              }
            }
          }
        }
      ],
      "useLegacySql": false,
      "parameterMode": "NAMED"
    }