单个SQL查询中的多重比较

时间:2017-06-17 11:00:52

标签: sql sqlite join sql-like

我需要通过比较不同视图中的两列来获取地址行

一个是地址数据库

    CREATE TABLE IDData (
    id      INTEGER PRIMARY KEY AUTOINCREMENT,
    cgi     STRING,
    cellid  STRING,
    address STRING,
);

还有另一张表,

CREATE TABLE cdata (
    id       INTEGER PRIMARY KEY AUTOINCREMENT,
   fcellid  TEXT,
);

IDData
id  cgi            cellid      address
1   123456789879   9879        512- baker street london
2   {blank}        9462        23 panama beach
3   456789879324   {blank}     Chandni chowk delhi

cdata
id    fcellid
1     123456789879
2     9462
3     9324

结果应该是

fcellid        address
123456789879   512- baker street london
9462           23 panama beach
9324           Chandni chowk delhi

现在我尝试的是

SELECT fcellid,iii.address FROM cdata as dd left JOIN IDData as iii ON (iii.cgi like '%' || dd.fcellid or dd.fcellid like '%' || iii.cgi) or (iii.cellid like '%' || dd.fcellid or dd.fcellid like '%' || iii.cellid );

但是没有工作因为期望给出太多的结果,因为它返回了每个条件的结果,我想只获得cdata中fcellid数量的结果。

2 个答案:

答案 0 :(得分:1)

我认为这种逻辑符合你的要求:

SELECT fcellid, i.address
FROM cdata dd left join
     IDData i
     ON dd.fcellid like ('%' || i.cgi) or
        dd.fcellid like ('%' || i.cellid) ;

或者更简单:

SELECT fcellid, i.address
FROM cdata dd left join
     IDData i
     ON dd.fcellid ~ concat('(', i.cgi, '|', i.cellid, ')$')

但是,这并不能完全返回您想要的结果集,因为第3行的匹配是'Chandni chowk delhi',而不是其他值之一。

答案 1 :(得分:0)

如果我理解你的问题,LEFT JOIN类型的联接将在其他场景中返回您期望的更多记录。我相信最好使用INNER JOIN或只是JOIN,这是同样的事情。

SELECT fcellid,address 从 cdata(NOLOCK) JOIN IDData(NOLOCK) 上 cgi喜欢CONCAT('%',fcellid) 要么 cellid LIKE CONCAT('%',fcellid)

在SELECT语句中也始终使用(NOLOCK)。