如何使用值为OR或IS NULL的IF语句构建WHERE子句

时间:2019-05-25 16:07:26

标签: mysql sql

如果要过滤作为值或NULL的属性值,使用WHERE子句似乎很棘手。

这用于Retool(动态MySQL环境)。我试图将其拆分为不同的AND子句,但它似乎比看起来更难,因为值需要一个方程式,而IS NULL则不需要。

import React from 'react';
import { selectAll } from '../actions';
import { connect } from 'react-redux';

const CheckAll = () => {
    return (
        <div>
            TodoList <input type="checkbox" onChange={e => {
                e.preventDefault();
                selectAll()
                }}/>
        </div>
    )
}

const mapDispatchToProps = dispatch => {
    return {
        selectAll: () => dispatch({type: 'SELECT_ALL'})
    }
}

export default connect(mapDispatchToProps)(CheckAll);

import React from 'react';
import { connect } from 'react-redux';
import { removeTodo } from '../actions';

const TodoList = ({ todos, removeTodo }) => {
    return (
        <div>
             {todos.map((todo) => {
                return (
                    <li key={todo.id}>
                        // checkbox should be toggling here when somene clicks on the selectAll checkbox. 
                        <input type="checkbox" checkbox="false"/> 
                        {todo.text}
                        <span onClick={e => removeTodo(todo.id, 1)}>x</span>
                    </li>
                )
            } )}
         
        </div>
    )
}

const mapDispatchProps = dispatch => {
    return {
        removeTodo: id => dispatch(removeTodo(id))
    }
}

const mapStateToProps = state => {
    return {
        todos: state.reducer || []
    }
}

export default connect(mapStateToProps, mapDispatchProps)(TodoList);

// the reducer below

const reducer = (state = [], action) => {
    switch(action.type) {
        case 'ADD_TODO':
            return [
                ...state, 
                {
                    id: action.id,
                    text: action.payload,
                    completed: action.completed
                }
            ];
        case 'REMOVE_TODO':
            return state.filter(({id}) => id !== action.id);
        case 'SELECT_ALL':
            console.log('');
            const allMarked = state.every(action => action.completed);
           
            return state.map(todo => ({
                ...todo,
                completed: !allMarked
            }));
        default: 
            return state;
    }
}

export default reducer;

我需要一个根据复选框的状态提供列表的查询:

如果checkbox = true,我想选择过滤值为0的记录

如果checkbox = false,我想选择过滤器值为1或为空的记录

4 个答案:

答案 0 :(得分:1)

不是。您可以只使用OR

WHERE (filter = {{checkbox1.value}} OR {{checkbox1.value}} IS NULL)

答案 1 :(得分:1)

目前还不清楚您要检查为空的内容,我想您是说filter

SELECT *
FROM table
WHERE 
  ({{checkbox1.value}} AND filter = 0) 
  OR 
  ((NOT {{checkbox1.value}}) AND coalesce(filter, 1) = 1))
ORDER BY order DESC

答案 2 :(得分:0)

在MySQL中,查询中的IF语句像这样

IF(条件,value_if_true,value_if_false)

而2nd和3rd参数是可选的,而第一个参数是必需的。

所以答案可能是

选择* 从表 过滤器= IF({{checkbox1.value}} = TRUE,0,1)并且为空 按订单DESC

答案 3 :(得分:0)

  

如果checkbox = true,我想选择过滤值是的记录   0

     

如果checkbox = false,我想选择记录中过滤值的位置   是1或为空

几乎从字面上翻译为代码:

WHERE
  CASE 
    WHEN {{checkbox1.value}} = TRUE  THEN filter = 0
    WHEN {{checkbox1.value}} = FALSE THEN filter = 1 OR filter IS NULL
  END

可以简称为

WHERE
  CASE {{checkbox1.value}}
    WHEN TRUE  THEN filter = 0
    WHEN FALSE THEN COALESCE(filter, 1) = 1
  END

但是由于在MySQL中,TRUEFALSE只是10的别名,因此您也可以使用以下方式表达相同的逻辑

WHERE COALESCE(filter, 1) = (NOT {{checkbox1.value}})

WHERE COALESCE(filter, 1) = (1 - {{checkbox1.value}})