按条件正确的数量排序
order by with the number of correct condition
我有 16 个 condition.I 想要 order by
在 TRUE 条件下。这意味着具有 16 个 TRUE 条件的记录高于具有 15 个 TRUE 条件的记录。
如果我执行以下操作:
select * from tbluser
order by case
when field1 like 'abc' AND field2 like 'aaa' AND ... field16 like 'bbb' then 1
when field1 like 'abc' AND field2 like 'aaa' AND ... field15 like 'ccc' then 2
.
.
.
when field2 like 'aaa' then 255
when field1 like 'abc' then 256
如你所见,我应该写256个when
,每个都有几个条件
考虑到正确条件的数量很重要,没有其他优先级,有没有更好的解决方案?
你的问题不是很清楚,但听起来你只是想在聚合字段上订购....所以这里有一个简单的例子......
创建table #tmp (f1 int, f2 bit)
插入 #tmp SELECT 1, 1
插入 #tmp SELECT 1, 1
插入 #tmp SELECT 1, 1
插入 #tmp SELECT 2, 1
插入 #tmp SELECT 2, 1
插入 #tmp SELECT 3, 1
插入 #tmp SELECT 4, 1
插入 #tmp SELECT 4, 1
SELECT f1, 计数(f2)
来自#tmp
其中 f2 = 1 -- 真
按 f1 分组
按 2 降序排序,1
您必须决定计数是否相等的规则。
对于 ANSI SQL 解决方案,您可以只分配真谓词 1 和假谓词 0,然后将条件相加,并按降序排列:
ORDER BY
CASE WHEN Field1 LIKE 'abc' THEN 1 ELSE 0 END +
CASE WHEN Field2 LIKE 'aaa' THEN 1 ELSE 0 END +
...
CASE WHEN Field16 LIKE 'bbb' THEN 1 ELSE 0 END DESC;
因为它是 MySQL 你可以稍微走捷径,因为它允许对布尔值进行加法:
ORDER BY (Field1 LIKE 'abc') + (Field2 LIKE 'aaa') ... + (Field16 LIKE 'bbb') DESC;
我有 16 个 condition.I 想要 order by
在 TRUE 条件下。这意味着具有 16 个 TRUE 条件的记录高于具有 15 个 TRUE 条件的记录。
如果我执行以下操作:
select * from tbluser
order by case
when field1 like 'abc' AND field2 like 'aaa' AND ... field16 like 'bbb' then 1
when field1 like 'abc' AND field2 like 'aaa' AND ... field15 like 'ccc' then 2
.
.
.
when field2 like 'aaa' then 255
when field1 like 'abc' then 256
如你所见,我应该写256个when
,每个都有几个条件
考虑到正确条件的数量很重要,没有其他优先级,有没有更好的解决方案?
你的问题不是很清楚,但听起来你只是想在聚合字段上订购....所以这里有一个简单的例子......
创建table #tmp (f1 int, f2 bit) 插入 #tmp SELECT 1, 1 插入 #tmp SELECT 1, 1 插入 #tmp SELECT 1, 1 插入 #tmp SELECT 2, 1 插入 #tmp SELECT 2, 1 插入 #tmp SELECT 3, 1 插入 #tmp SELECT 4, 1 插入 #tmp SELECT 4, 1
SELECT f1, 计数(f2) 来自#tmp 其中 f2 = 1 -- 真 按 f1 分组 按 2 降序排序,1
您必须决定计数是否相等的规则。
对于 ANSI SQL 解决方案,您可以只分配真谓词 1 和假谓词 0,然后将条件相加,并按降序排列:
ORDER BY
CASE WHEN Field1 LIKE 'abc' THEN 1 ELSE 0 END +
CASE WHEN Field2 LIKE 'aaa' THEN 1 ELSE 0 END +
...
CASE WHEN Field16 LIKE 'bbb' THEN 1 ELSE 0 END DESC;
因为它是 MySQL 你可以稍微走捷径,因为它允许对布尔值进行加法:
ORDER BY (Field1 LIKE 'abc') + (Field2 LIKE 'aaa') ... + (Field16 LIKE 'bbb') DESC;