sql如何找到字符串值几乎相同的记录?

vwhgwdsa  于 2021-07-29  发布在  Java
关注(0)|答案(3)|浏览(369)

假设我有这个表(产品):

part_number   product_name
1202          airpods
1204          ipod
1398          iphone 6
1304          watch I
1378          iphone 7
1244          airpods 2

我要选择 part_number 除第三个字符外,至少有一个匹配项(几乎完美)。所以最终结果是这样的:

part_number   product_name
1204          ipod
1398          iphone 6
1378          iphone 7
1244          airpods 2

有没有办法用like操作符来做这个?我知道like在陈述几个已知的字符时可以找到模式,但在这种情况下,我不一定知道那些是什么。
note:yeah,零件号字段定义为字符串,而不是数字。

y0u0uwnf

y0u0uwnf1#

我知道您需要的行中存在另一行的零件号部分匹配:前两个数字和最后一个数字应该匹配,而第三个数字不同。
你可以用 exists . 假设 part_number 是一个整数(应该是这样),您可以使用算术:

select p.*
from products p
where exists (
    select 1
    from products p1
    where 
        p1.part_number <> p.part_number
        and p1.part_number / 100 = p.part_number / 100
        and p1.part_number - p1.part_number / 10 * 10 = p.part_number - p.part_number / 10 * 10
)

您还可以使用字符串函数-这使得查询更容易理解(尽管效率可能更低):

select p.*
from products p
where exists (
    select 1
    from products p1
    where 
        p1.part_number <> p.part_number
        and substr(p1.part_number, 1, 2) = substr(p.part_number, 1, 2)
        and substr(p1.part_number, 4, 1) = substr(p.part_number, 4, 1)
)

db fiddle上的演示-两个查询都产生:

part_number | product_name
:---------- | :-----------
1204        | ipod        
1398        | iphone 6    
1378        | iphone 7    
1244        | airpods 2
k0pti3hp

k0pti3hp2#

目前还没有sqlite,但在大多数sql变体中,这是可行的:

select * from test t1 where exists
(
 select * from test t2 where t2.part_number != t1.part_number 
 and left(t1.part_number,2) = left(t2.part_number,2)
 and right(t1.part_number,1) = right(t2.part_number,1)
)
r7knjye2

r7knjye23#

你可以用 COUNT() 窗口功能:

select part_number, product_name
from (
  select *, 
    count(*) over (partition by substr(part_number, 1, 2), substr(part_number, -1)) counter
  from products
)
where counter > 1

请看演示。
结果:

| part_number | product_name |
| ----------- | ------------ |
| 1204        | ipod         |
| 1244        | airpods 2    |
| 1398        | iphone 6     |
| 1378        | iphone 7     |

相关问题