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

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

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

  1. part_number product_name
  2. 1202 airpods
  3. 1204 ipod
  4. 1398 iphone 6
  5. 1304 watch I
  6. 1378 iphone 7
  7. 1244 airpods 2

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

  1. part_number product_name
  2. 1204 ipod
  3. 1398 iphone 6
  4. 1378 iphone 7
  5. 1244 airpods 2

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

y0u0uwnf

y0u0uwnf1#

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

  1. select p.*
  2. from products p
  3. where exists (
  4. select 1
  5. from products p1
  6. where
  7. p1.part_number <> p.part_number
  8. and p1.part_number / 100 = p.part_number / 100
  9. and p1.part_number - p1.part_number / 10 * 10 = p.part_number - p.part_number / 10 * 10
  10. )

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

  1. select p.*
  2. from products p
  3. where exists (
  4. select 1
  5. from products p1
  6. where
  7. p1.part_number <> p.part_number
  8. and substr(p1.part_number, 1, 2) = substr(p.part_number, 1, 2)
  9. and substr(p1.part_number, 4, 1) = substr(p.part_number, 4, 1)
  10. )

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

  1. part_number | product_name
  2. :---------- | :-----------
  3. 1204 | ipod
  4. 1398 | iphone 6
  5. 1378 | iphone 7
  6. 1244 | airpods 2
展开查看全部
k0pti3hp

k0pti3hp2#

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

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

r7knjye23#

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

  1. select part_number, product_name
  2. from (
  3. select *,
  4. count(*) over (partition by substr(part_number, 1, 2), substr(part_number, -1)) counter
  5. from products
  6. )
  7. where counter > 1

请看演示。
结果:

  1. | part_number | product_name |
  2. | ----------- | ------------ |
  3. | 1204 | ipod |
  4. | 1244 | airpods 2 |
  5. | 1398 | iphone 6 |
  6. | 1378 | iphone 7 |
展开查看全部

相关问题