检查行中的不同值-sql

hgncfbus  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(277)

给定一个包含列(col1,col2,col3,col4,…)的表,我们如何查询该表,使其仅返回特定列子集(例如(col2,col4,col5)的值彼此不同的行。
例如,对于该表(该表是在执行一些交叉联接和查询之后生成的),将列的子集定义为(t1\u id、t2\u id、t3\u id):

然后查询应返回以下内容:

列的子集将是可变的,并且可以非常大,因此使用类似于 where t1.id<>t2.id and t1.id<>t3.id and t2.id<>t3.id 不是一个方便的方法。

xoshrz7s

xoshrz7s1#

一个简单的解决方案是在n-1列的条件中使用not。
每增加一次,可以缩短一次。
例如,如果有5列:

WHERE t1.id NOT IN (t5.id, t4.id, t3.id, t2.id)
  AND t2.id NOT IN (t5.id, t4.id, t3.id)
  AND t3.id NOT IN (t5.id, t4.id)
  AND t4.id <> t5.id

另一种方法是连接id,然后使用regex。

-- test table with numbers 
create table test (id int primary key);
insert into test values (1),(2),(3),(4),(5);

-- cross joining the numbers and only get those with unique number combinations 
select t1.id as id1, t2.id as id2, t3.id as id3, t4.id as id4, t5.id as id5
from test t1 
cross join test t2 
cross join test t3 
cross join test t4
cross join test t5
where concat_ws(' ',t1.id,t2.id,t3.id,t4.id,t5.id) not rlike '\\b(\\d+)\\b.*\\b\\1\\b';

在dbfiddle上测试mariadb 10.2

cyvaqqii

cyvaqqii2#

这个 not in 方法对我来说最有意义。
但是,mariadb支持pcre正则表达式。这些都支持反向引用。因此,您可以使用它们来查找重复项:

where concat(',', concat_ws(',', t1.id, t2.id, t3.id), ',') not regexp '([^,]+).*,\1,'

请注意,您可能需要将反斜杠加倍,因为它通常是转义字符。

相关问题