繁体   English   中英

如何在 MySQL 5.6 中执行 IF (X OR Y)

[英]How to do an IF (X OR Y) in MySQL 5.6

我想根据加入的一个或另一个条件(如果给我钱的人是一位Great Benefactor或钱来自一个名为nuit的活动)来创建和定义命令表的一列(对我的应用程序的捐赠) )。 然后我试过了

        UPDATE orders
        INNER JOIN contacts ON orders.id = contacts.`Contact ID`
        IF contacts.`Great Benefactor` = true OR orders.Campaign = `nuit`
            SET orders.exclude_from_statistics = 1
        ELSE
            SET orders.exclude_from_statistics = 0
            ;

但它返回:

2021-07-07 20:05:53.674026 - creating column excude from statistics
Traceback (most recent call last):
  File "/usr/lib64/python3.9/runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib64/python3.9/runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "/home/ac/Documents/Programming/Work/data-tools/etl/task/exclude.py", line 27, in <module>
    main()
  File "/home/ac/Documents/Programming/Work/data-tools/etl/task/exclude.py", line 23, in main
    add_column_exclude_from_statistics()
  File "/home/ac/Documents/Programming/Work/data-tools/etl/task/exclude.py", line 11, in add_column_exclude_from_statistics
    c.execute("""
  File "/home/ac/Documents/Programming/Work/data-tools/venv/lib64/python3.9/site-packages/MySQLdb/cursors.py", line 206, in execute
    res = self._query(query)
  File "/home/ac/Documents/Programming/Work/data-tools/venv/lib64/python3.9/site-packages/MySQLdb/cursors.py", line 319, in _query
    db.query(q)
  File "/home/ac/Documents/Programming/Work/data-tools/venv/lib64/python3.9/site-packages/MySQLdb/connections.py", line 259, in query
    _mysql.connection.query(self, query)
MySQLdb._exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF contacts.`Great Benefactor` = true OR orders.Campaign = `nuit`\n            SE' at line 3")

我认为我在IF contacts.的情况下是错误的IF contacts. Great Benefactor = true OR orders.Campaign = orders.Campaign = true OR orders.Campaign = nuit`` 看起来很pythonistic。

我也试过:

     IF(contacts.`Great Benefactor` = true OR orders.Campaign = `nuit`
         SET orders.exclude_from_statistics = 1,
         SET orders.exclude_from_statistics = 0)

这是完整的脚本:

from etl.utils.logging import info
from etl.mysql.connect import db, db_name
from etl.mysql.operations import add_column_if_not_exists


def add_column_exclude_from_statistics():
    add_column_if_not_exists(db, db_name, 'orders', 'exclude_from_statist
    info("creating column excude from statistics")
    c = db.cursor()
    c.execute("""
        UPDATE orders
        INNER JOIN contacts ON orders.id = contacts.`Contact ID`
        IF contacts.`Great Benefactor` = true OR orders.Campaign = `nuit`
            SET orders.exclude_from_statistics = 1
        ELSE
            SET orders.exclude_from_statistics = 0
            ;
        """)

def main():
    info("Column users.segmentation_2019")
    add_column_exclude_from_statistics()


if __name__ == '__main__':
    main()

我试过戈登的回答:

    UPDATE orders AS o JOIN
       contacts AS c
       ON o.id = c.`Contact ID`
    SET o.exclude_from_statistics = (c.`Great Benefactor` = true
        OR o.Campaign = 'nuit');""")

但得到:

2021-07-08 14:41:09.687383 - creating column excude from statistics
Traceback (most recent call last):
  File "/usr/lib64/python3.9/runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib64/python3.9/runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "/home/ac/Documents/Programming/Work/data-tools/etl/task/exclude.py", line 22, in <module>
    main()
  File "/home/ac/Documents/Programming/Work/data-tools/etl/task/exclude.py", line 18, in main
    add_column_exclude_from_statistics()
  File "/home/ac/Documents/Programming/Work/data-tools/etl/task/exclude.py", line 10, in add_column_exclude_from_statistics
    c.execute("""
  File "/home/ac/Documents/Programming/Work/data-tools/venv/lib64/python3.9/site-packages/MySQLdb/cursors.py", line 206, in execute
    res = self._query(query)
  File "/home/ac/Documents/Programming/Work/data-tools/venv/lib64/python3.9/site-packages/MySQLdb/cursors.py", line 319, in _query
    db.query(q)
  File "/home/ac/Documents/Programming/Work/data-tools/venv/lib64/python3.9/site-packages/MySQLdb/connections.py", line 259, in query
    _mysql.connection.query(self, query)
MySQLdb._exceptions.OperationalError: (1054, "Unknown column 'o.id' in 'on clause'")

只需使用表达式。 if需要,则否:

    UPDATE orders o JOIN
           contacts c
           ON o.id = c.`Contact ID`
        SET o.exclude_from_statistics = (c.`Great Benefactor` = true OR o.Campaign = 'nuit';

笔记:

  • 表别名使查询更易于编写和阅读。
  • 我假设'nuit'是一个字符串,而不是表中的一列。
  • 奇怪的是,列orders.id会与另一个表中的联系人 ID 进行比较,但这是在您的原始查询中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM