mysql 从动态表名中查询数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 从动态表名中查询数据相关的知识,希望对你有一定的参考价值。

有一个表 是根据年月来生成的 比如现在的表名是 test_09_03 下个月的就是 test_09_04 现在我想要一条语句就可以每个月从相应的表中查询数据,即 select * from test_09_03 下个月就是 select * from test_09_04 如如何在一条语句中进行判断日期?
谢谢!
只能用SELECT语句

参考技术A 使用存储过程,把表名作为参数传进来。
CREATE PROCEDURE proName
@TableName varchar(50)
AS
DECLARE @SelectText varchar(500)
Set @SelectText = 'SELECT * FROM ' + @TableName
exec (@SelectText)

你要的是这个么?

那直接写:
string tablename=???
string strSql="select * from '"+tablename+"'";

关于时间用SUBSTRING函数取得上月时间最后一位然后在其上加一就是下个月的时间(其中要判断是否>12了)

如何使用基于自定义参数的表名中类似于 python 的字符串格式查询谷歌数据工作室中的 bigquery 表?

【中文标题】如何使用基于自定义参数的表名中类似于 python 的字符串格式查询谷歌数据工作室中的 bigquery 表?【英文标题】:How to query bigquery tables in google data studio with python-like string formatting in table names based on custom parameters? 【发布时间】:2020-10-21 19:23:11 【问题描述】:

因此,我每年都有几张表格,其中包含每种产品的表格,表格如下: 2020product5, 2019product5, 2018product6 等等。我在 google data studio 中添加了两个自定义参数,命名为 year 和 product_id,但不能在表名中使用它们。我之前使用过参数化查询,但在where product_id = @product_id 等条件下使用,但此设置仅在所有数据都在同一个表中时才有效,这不是我当前的情况。在python中,我使用f"yearproductproduct_id"之类的字符串格式化程序,但这显然在这种情况下不起作用...... 使用 Bigquery 默认 CONCAT 和 FORMAT 函数无济于事,因为两者都会引发以下验证错误:Table-valued function not found: CONCAT at [1:15]

那么,如何在 google Data Studio 中使用基于自定义参数的表名中类似 python 的字符串格式查询 bigquery 表?

【问题讨论】:

这可能与以下内容重复:***.com/questions/51475252/… 不,这不是。它仅涵盖表后缀部分,这是我正在使用的当前工作,正如我在下面的回答中提到的那样。我的问题是关于动态选择彼此不同的表。不仅仅是后缀,实际上是一个由后缀分区的表。 【参考方案1】:

经过大量研究,我(有点)整理出来了。原来它是查询模式级实体的数据库级功能,例如动态表名。 BigQuery 不支持表名中的格式设置,如问题中的表(例如2020product52019product52018product6)无法直接查询。但是,它确实有一个 TABLE_SUFFIX 函数,允许您动态访问表,因为表名的更改位于表的末尾。 (此功能还允许进行 dateweise 分区和许多使用 BQ 作为数据接收器的工具,利用它。因此,如果您使用 BQ 作为数据接收器,很有可能您的原始数据源已经这样做了)。因此,像 (product52020, product52019, product62018) 这样的表名也可以通过以下方式动态访问,当然也可以从数据工作室访问:

SELECT * FROM `project_salsa_101.dashboards.product*` WHERE _table_Suffix = CONCAT(@product_id,@year) 

P.S.:使用 python 创建了一个脏脚本,该脚本循环遍历产品和表格,并复制并创建了新的脚本,如下所示:(添加带有格式化字符串的脚本,因此它可能对任何有这种情况的人都有用)

import itertools
credentials = service_account.Credentials.from_service_account_file(
    'project_salsa_101-bq-admin.json')
project_id = 'project_salsa_101'
schema = 'dashboards'
client = bigquery.Client(credentials= credentials,project=project_id)

for product_id, year in in itertools.product(product_ids, years): 
    df = client.query(f"""
            SELECT *  FROM `project_id.schema.yearproductproduct_id`
            """).result().to_dataframe()
    df.to_gbq(project_id = project_id,
                destination_table = f'schema.productproduct_idyear',
                credentials = service_account.Credentials.from_service_account_file(
                    'credentials.json'),
                if_exists = 'replace')
    client.query(f"""
            DROP TABLE `project_id.schema.yearproductproduct_id`""").result()

【讨论】:

以上是关于mysql 从动态表名中查询数据的主要内容,如果未能解决你的问题,请参考以下文章

oracle动态查询通过sql获取游标变量

PHP + Mysql:来自第一个查询的动态表名,用于执行第二个查询

mysql中查询语句的表名,是不是可以动态选择表名像这样

数据库水平分割,动态表名查询

SQL 查询 SELECT FROM [从表名中选择值]

sql SQLSCRIPT HANA从表名中按字符串动态选择*