【问题标题】:How can I replace a variable with the defined value of this variable in MySQL?如何在 MySQL 中用这个变量的定义值替换一个变量?
【发布时间】:2015-09-03 07:25:28
【问题描述】:

将字符串分配给定义的变量isWeekdays

set @isWeekdays='calendar.monday=1 AND calendar.tuesday=1 AND calendar.wednesday=1 AND calendar.thursday=1 AND calendar.friday=1';

我希望变量 isWeekdays 在执行查询时可以替换为字符串,例如,

SELECT * FROM calendar WHERE @isWeekdays;

-- expect to    
SELECT * FROM calendar WHERE calendar.monday=1 AND calendar.tuesday=1 AND calendar.wednesday=1 AND calendar.thursday=1 AND calendar.friday=1;

但是没有生效。

【问题讨论】:

  • 看看MySql中的动态查询。即stackoverflow.com/questions/23178816/…
  • mysql 将变量内容视为不透明的 blob。您正在执行的操作相当于select ... where 'solidstring'。如果您希望变量的内容作为查询的一部分被评估/执行,您必须使用动态 sql:构建一个新的查询字符串,添加变量的内容,执行新的字符串。
  • 说真的,为什么还要这样做呢?你只是无聊吗?需要爱好吗?
  • @NotoriousPet0 因为我在我的 sql 查询中多次使用@isWeekdays。现在,我知道dynamic queries 可以做到。
  • 为什么不让它成为您使用的任何脚本语言的变量?

标签: mysql sql


【解决方案1】:

@isWeekdays 将在查询中计算为数字,您必须使用语句,它将作为动态查询:

-- setting the @isWeekdays variable
set @isWeekdays='calendar.monday=1 AND calendar.tuesday=1 
     AND calendar.wednesday=1 AND calendar.thursday=1 
      AND calendar.friday=1';


-- using the @isWeekdays variable in dynamic query
set @sql = concat('SELECT * FROM calendar WHERE ',@isWeekdays);
prepare stmt1 FROM @sql; 
execute stmt1; 
-- you muyst close the prepared statement
deallocate prepare stmt1; 

您可以在同一会话中更改@isWeekdays,然后再次打开该语句。

就是这样。

【讨论】:

    【解决方案2】:

    @Notorious Pet0的帮助下,相比动态查询,使用脚本语言似乎更好。关键源代码(使用python中的格式字符串)如下。

    #!/usr/bin/env python
    import MySQLdb
    import codecs  #for charset utf-8
    
    ## connect to MySQL
    db = MySQLdb.connect(host="localhost",
            user="root",
            passwd="Jelline", # password
            db="gtfs")  #name of the data base
    
    ## create a Cursor object to execute sql queries
    cur = db.cursor()
    
    ## execute queries
    isWeekdays = 'calendar.monday=1 AND calendar.tuesday=1 AND calendar.wednesday=1 AND calendar.thursday=1 AND calendar.friday=1'
    sql = 'SELECT * FROM calendar WHERE {isWeekdays}'.format(isWeekdays=isWeekdays)
    
    cur.execute(sql)
    
    ## write to a file
    with open('test.txt', 'w') as fp : #fp is a file object
        for row in cur.fetchall() :
            s = '\t'.join(str(item) for item in row)
            fp.write(s + '\n')
    
    ## clean up
    fp.close()
    cur.close()
    db.close()
    

    【讨论】:

      猜你喜欢
      • 2012-10-16
      • 2019-11-01
      • 1970-01-01
      • 2022-11-17
      • 2019-09-01
      • 2013-08-06
      • 1970-01-01
      • 2018-09-22
      • 1970-01-01
      相关资源
      最近更新 更多