V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NoKey
V2EX  ›  程序员

请教一下,这种 sql 怎么写

  •  1
     
  •   NoKey · 2020-05-14 09:45:33 +08:00 · 2434 次点击
    这是一个创建于 1657 天前的主题,其中的信息可能已经有所发展或是发生改变。

    数据库是 oracle

    我从一个表里查处的数据类似于 1,2,3

    然后,这个是另外一个数据表的 id,我想把这个结果放到 in 里面,这样查出 id 对应的数据信息。

    大概就是 select * from a where id in (select ids from b)

    但是我不知道怎么把结果放到 in 里

    求大佬指教,谢谢。

    15 条回复    2020-05-18 11:49:15 +08:00
    getui163
        1
    getui163  
       2020-05-14 09:57:06 +08:00
    你这个 1,2,3 如果是多行的,你这个写法完全 OK 啊
    或者 join 也行

    如果这个数据是单行的某列,想按逗号拆分,看下 REGEXP_SUBSTR 这个函数
    RSDTE
        2
    RSDTE  
       2020-05-14 09:57:45 +08:00
    SELECT * FROM a c WHERE EXISTS( SELECT id FROM b o WHERE o.id=c.id)

    这个意思?
    liuhuan475
        3
    liuhuan475  
       2020-05-14 09:59:48 +08:00
    多列?用 union all
    Johnny168
        4
    Johnny168  
       2020-05-14 10:10:05 +08:00
    是想把数据字段( 1,2,3 ),拆成'1','2','3' 三个 ID 的意思吗?
    xuanbg
        5
    xuanbg  
       2020-05-14 10:13:09 +08:00
    楼主的意思大概是 A 表的某些 id 存在 B 表的某个字段,以逗号分隔。然后根据这个字段查询 A 表的记录。

    直接 in 是不行的,要用函数处理一下,具体的做法可以百度。
    RJH
        6
    RJH  
       2020-05-14 10:13:42 +08:00
    oracle 有个 FIND_IN_SET 函数,你可以看看是否满足你的需求
    sh0214
        7
    sh0214  
       2020-05-14 10:36:35 +08:00
    把 b 表的结果用字段存起来然后做拼接?
    c6h6benzene
        8
    c6h6benzene  
       2020-05-14 13:34:49 +08:00 via iPhone
    新的 SQL SERVER 有 split_string 函数
    NoKey
        9
    NoKey  
    OP
       2020-05-14 14:49:02 +08:00
    @getui163 谢谢,就是一个字段,里面存的是 1,2,3
    NoKey
        10
    NoKey  
    OP
       2020-05-14 14:49:37 +08:00
    @Johnny168 是的,查出来是 1,2,3 想直接放到 in 里面
    NoKey
        11
    NoKey  
    OP
       2020-05-14 14:50:09 +08:00
    @xuanbg 谢谢,是这个意思,一个字段就是 1,2,3 这样的字符串
    PopRain
        12
    PopRain  
       2020-05-14 14:57:34 +08:00
    我猜 SQL SERVER 可以这么写
    select * from a inner join b on (b.ids like a.id+',%' or b.ids like ','+a.id+'%')

    id 不能又包含关系 1,11,111 不行
    CRVV
        13
    CRVV  
       2020-05-14 15:34:30 +08:00
    都用上 oracle 这么高级的数据库了,请正经地设计一下表。不要用这种奇怪的方式来储存一对多或者多对多的数据。

    一定要这么查的话,用 PostgreSQL 是这么写的
    with a(id, v) as (values (1,'a'), (2,'b'), (3,'c')), b(id,ids) as (values (8, '1,3,4'), (9,'2,5,8'))
    SELECT * from b
    cross join regexp_split_to_table(ids, ',') as aids(aid)
    inner join a on a.id = aids.aid::int
    where b.id = 8;
    NoKey
        14
    NoKey  
    OP
       2020-05-18 10:57:23 +08:00
    @RJH 我百度了一下,FIND_IN_SET 说是 msyql 的
    RJH
        15
    RJH  
       2020-05-18 11:49:15 +08:00
    @NoKey 哦哦,那应该是我记错了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1058 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:10 · PVG 04:10 · LAX 12:10 · JFK 15:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.