【问题标题】:How to Find Items that Do NOT Have a pre-Pipe "Base" Value如何查找没有预管道“基础”值的项目
【发布时间】:2017-10-10 11:06:14
【问题描述】:

我有一个数据库,在表(部分)中有一个列 (obj_id),我应该有一个 obj_id 为 12345 的数据库,它是另一行的集合,该行将有 12345|。

所以:

select obj_id from parts where obj_id like '12345%';
12345
12345|A
12345|B
12345|77

现在,有人违反了指导方针,将一些带有管道值但没有基础值的项目放入了无管道(例如 12378|J、12378|8 但不是 12378)。

我需要知道如何编写 SQL 查询来查找表中没有匹配的基本(非管道)值的这些管道值。

【问题讨论】:

  • 请您添加一个标签来表明您正在使用哪个 RDBMS?
  • 我想指出,将多个项目存储在一个字段中的决定总是会找到一种创造性的方式来伤害你。该查询在设计合理的模式中编写起来是微不足道的,每个 ID 都存储在单独的行中。您甚至不必编写该查询,因为外键约束首先会阻止“孤立”值被插入。如果您仍然可以选择重新设计架构,那么这样做可能是个好主意。
  • 请问是哪个 dbms 的?提供一些样本数据和预期的结果——也许创建一个sqlfiddle.com
  • 您遇到的问题正是您不应该将分隔值存储在单个列中的原因。

标签: sql oracle split csv


【解决方案1】:

如果没有一些实际的示例数据可以使用,就很难知道您真正想要什么。下面的 2 个查询可能会有所帮助,但也许它也会让您注意到样本数据的有用性:

SQL Fiddle查看此工作

CREATE TABLE PARTS
    (id int, OBJ_ID varchar2(200))
;

INSERT ALL 
    INTO PARTS (id, OBJ_ID)
         VALUES (1,'12345 12345|A 12345|B 12345|77')
    INTO PARTS (id, OBJ_ID)
         VALUES (2,'12346|A 12346|B 12346|77')
    INTO PARTS (id, OBJ_ID)
         VALUES (3,'12378|J, 12378|8')
    INTO PARTS (id, OBJ_ID)
         VALUES (4,NULL)
    INTO PARTS (id, OBJ_ID)
         VALUES (5,'fred. wilma, barney, betty')
SELECT * FROM dual
;

查询 1

select
*
from PARTS p
where instr(p.OBJ_ID,' ') > instr(p.OBJ_ID,'|')

Results

| ID |                     OBJ_ID |
|----|----------------------------|
|  2 |   12346|A 12346|B 12346|77 |
|  3 |           12378|J, 12378|8 |
|  5 | fred. wilma, barney, betty |

查询 2

select
       id, rn_a, regexp_substr (OBJ_ID_SPLIT, '[^|]+', 1, rn_b) as OBJ_ID_SPLIT
from (
      select 
             p.id, c1.rn_a, regexp_substr (p.OBJ_ID, '[^ ]+', 1, c1.rn_a) as OBJ_ID_SPLIT
      from PARTS p
      cross join (select rownum as rn_a
                   from (select max(length (regexp_replace (OBJ_ID, '[^|]+'))) + 1 as mx
                         from PARTS
                        )
                connect by level <= mx) c1
      where p.OBJ_ID like '%|%'       
      ) d
cross join (select 1 rn_b from dual union all select 2 from dual) c2
order by id, rn_a

Results

| ID | RN_A | OBJ_ID_SPLIT |
|----|------|--------------|
|  1 |    1 |        12345 |
|  1 |    1 |       (null) |
|  1 |    2 |        12345 |
|  1 |    2 |            A |
|  1 |    3 |        12345 |
|  1 |    3 |            B |
|  1 |    4 |        12345 |
|  1 |    4 |           77 |
|  2 |    1 |        12346 |
|  2 |    1 |            A |
|  2 |    2 |        12346 |
|  2 |    2 |            B |
|  2 |    3 |        12346 |
|  2 |    3 |           77 |
|  2 |    4 |       (null) |
|  3 |    1 |        12378 |
|  3 |    1 |           J, |
|  3 |    2 |        12378 |
|  3 |    2 |            8 |
|  3 |    3 |       (null) |
|  3 |    4 |       (null) |

【讨论】:

  • 谢谢,但用户无法更改架构或添加表。而且,PK 是应用程序管理的;未在 RDBMS 级别设置。
  • 我相信您在错误的位置添加了该评论。然而,我也同意这样的观点,即这种串联的价值观将成为巨大挫败感的根源。鉴于您对此感到困惑,也许您可​​以对查询发表评论?它们有帮助吗?你能提供更好的样本数据吗?
  • 好吧,评论涵盖了所有受访者,因为我不能使用“创建表”(因此:不能添加表)我想我将不得不求助于 SQL 的某种组合来提取数据进入 .TXT 文件,然后使用 AWK 和 SED 做我必须做的事情。谢谢大家!
  • 我的意思是“在错误的地方”,您的评论直接属于 cmets 关于重新设计的问题。不在我建议的查询范围内。
猜你喜欢
  • 2021-03-27
  • 2016-07-04
  • 1970-01-01
  • 2019-05-15
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
相关资源
最近更新 更多