MySQL IF THEN在WHERE子句中

时间:2013-08-02 12:00:53

标签: mysql

我的表有一个枚举列,可能的值为'relative'和'absolute'。可能有重复的行,区别在于列。

所以通常我会选择一个'绝对'值但我需要的行,如果caluse检查是否有'重复'行,其中列是'relative',然后选择该行(如果有的话)相关的行,总会有绝对的行)

伪代码:

select *
  from table
  where non_unique_col = 123
    and IF (has result row with 'relative'
        then return that row
        else return 'absolute' row)

4 个答案:

答案 0 :(得分:2)

你可以试试这个:

SELECT *
FROM `table`
WHERE `non_unique_col` = 123
ORDER BY `absolute_relative_col` DESC
LIMIT 1

这样,如果只有一个结果,没问题,如果有更多,你得到'亲戚'。

编辑:

根据@Travesty3的建议,我想强调一下,这个查询的假设是(non_unique_col + absolute_relative_col)生成unique_col,这是基于OP语句

  

可能有重复的行,区别在于列

  

如果有相对行,那么总是会有绝对行

编辑2:

更通用的解决方案如下:

SELECT *
FROM `table` as t1
JOIN (
  SELECT non_unique_col, absolute_relative_col
  FROM `table`
  WHERE `absolute_relative_col` = 'relative'
) as t2 USING (non_unique_col)
WHERE t2.absolute_relative_col = 'relative' OR (
  t2.absolute_relative_col IS NULL
  AND t1.absolute_relative_col = 'absolute'
)

答案 1 :(得分:0)

以下(未经测试的)查询应返回您想要的内容,但与大多数使用子查询的查询一样,我认为它不是非常有效。

SELECT * 
FROM `table` 
WHERE `non_unique_col`=123 
AND ( 
    (`relativity` = 'relative') 
    OR (`relativity` = 'absolute' 
        AND NOT EXISTS (
            SELECT 1 
            FROM `table` 
            WHERE `non_unique_col`=123 
            AND `relativity`='relative'
        )
    )
);

请参阅this documentation

编辑:如果你想创建一个这样的列表(例如没有id),那么你会写这样的东西:

SELECT * 
FROM `table` as a 
WHERE (`relativity` = 'relative') 
OR (
    `relativity` = 'absolute' 
    AND NOT EXISTS (
        SELECT 1 
        FROM `table` as b 
        WHERE a.`non_unique_col`=b.`non_unique_col` 
        AND `relativity`='relative'
    )
);

答案 2 :(得分:0)

SELECT * 
FROM table1 
INNER JOIN (
    SELECT non_unique_col nuc, 
           MAX(absolute_relative_col) rec 
    FROM table1 
    GROUP BY non_unique_col 
) AS t ON nuc=non_unique_col AND rec=absolute_relative_col
-- (@Zessx: second condition is still part of the INNER JOIN ...)

修改

但是我喜欢COALESCE的想法(见上面草莓的评论!)好多了

SELECT * FROM table1 WHERE id IN ( 
 SELECT COALESCE(b.id,a.id) FROM tablel a 
 LEFT JOIN tbl b ON b.non_unique_col=a.non_unique_col
                AND b.absolute_relative_col='relative'
)

答案 3 :(得分:0)

如果行与相对或绝对部分相同,如果每个non_unique_column值只需要在行上,为什么不简单地使用:

select non_unique_col, max(rel_or_abs), extra_data from tbl
group by non_unique_col;

请参阅http://sqlfiddle.com/#!2/b97fc0/2