mysql 连接两列中的一个字符

ryevplcw  于 2023-10-15  发布在  Mysql
关注(0)|答案(2)|浏览(109)

我有以下两个表,我想内部连接的基础上,每个列的内容在两个表的一部分是等于一个值。在下面的例子中,我想内部连接两个表,我加入所有行,其中包括“B”在组列。

------------------------
First table TABLE1: 
Group       Name
------------------------
A,B,C,D,E   CustomerNameA... 
G,E,D,L,P   CustomerNameB...
A,B,C,D,E   CustomerNameC... 
...

------------------------
Second table TABLE2
Group   Device
------------------------
A,Z     CustomerDeviceA...
A,B,C   CustomerDeviceB...
Z,P,O   CustomerDeviceC...
B,C,E   CustomerDeviceD...
...

我不能使用

...
JOIN TABLE2
On TABLE1.Group like Concat('%', TABLE2.Group,'%')

因为“B”在TABLE1.Group和TABLE2.Group中的位置不稳定。“B”在两列中的某个地方。我试过:

...
JOIN TABLE2
On (TABLE1.Group like '%B%' AND TABLE2.Group like '%B%')

但它返回的结果与预期的不同。

1bqhqjot

1bqhqjot1#

你的问题缺乏足够的细节来提供一个单一的,准确的答案。
下面的查询是为SQL Server编写的,但概念应该很容易转换为MySQL。
我们将从输入开始:

with TABLE1 as (
  select *
  from (
    values
      ('A,B,C,D,E', 'CustomerNameA')
    , ('G,E,D,L,P', 'CustomerNameB')
    , ('A,B,C,D,E', 'CustomerNameC')
  ) q ([Group], [Name])
), 
TABLE2 as (
  select *
  from (
    values 
      ('A,Z'  , 'CustomerDeviceA')
    , ('A,B,C', 'CustomerDeviceB')
    , ('Z,P,O', 'CustomerDeviceC')
    , ('B,C,E', 'CustomerDeviceD')
  ) q ([Group], [Device])
)

这将给予您所有的数据,由“包含B”和“不包含B”连接:

T1 as (
  select *
  , case when [Group] like '%B%' then 1 else 0 end as joincol
  from TABLE1
),
T2 AS (
  select *
  , case when [Group] like '%B%' then 1 else 0 end as joincol
  from TABLE2
)

select *
from T1
  inner join T2 ON T2.joincol = T1.joincol

这将给予所有数据,显示由“contains B”连接的行和其他不匹配的行。

,
T1 as (
  select *
  , case when [Group] like '%B%' then 1 end as joincol
  from TABLE1
),
T2 AS (
  select *
  , case when [Group] like '%B%' then 1 end as joincol
  from TABLE2
)

select *
from T1
  full outer join T2 ON T2.joincol = T1.joincol

这将给予您仅由“contains B”连接的行。

,
T1 as (
  select *
  , case when [Group] like '%B%' then 1 end as joincol
  from TABLE1
),
T2 AS (
  select *
  , case when [Group] like '%B%' then 1 end as joincol
  from TABLE2
)

select *
from T1
  inner join T2 ON T2.joincol = T1.joincol

https://dbfiddle.uk/gANc7olQ

mpbci0fu

mpbci0fu2#

“我不能用”

JOIN TABLE2
On TABLE1.Group like Concat('%', TABLE2.Group,'%')

是的。但任务是:
在下面的例子中,我想内部连接两个表,我加入所有行,其中包括“B”在组列。
因此,您对所有具有B的项目感兴趣。因此,您可以使用用途:

JOIN TABLE2
ON CONCAT(',', TABLE1.Group, ',') LIKE '%B%' AND
   CONCAT(',', TABLE2.Group, ',') LIKE '%B%'

诀窍是我在Group的值前面加上一个逗号,这样对于CONCAT的结果来说,任何这样的字段,B或其他任何东西,如果出现在这个结果中,那么它将在两个逗号之间,这也处理了可变子串长度的问题。

相关问题