代码之家  ›  专栏  ›  技术社区  ›  Brett

在左连接-内部连接组合中选择nvarchar“like”

  •  1
  • Brett  · 技术社区  · 14 年前

    DataTable Items:
        ID   Title
        1    Some title
        2    Some other title
    ..etc..
    

    .

    DataTable Tags:
        ID   Tag
        1    'a1c'
        1    'a1d'
        2    'a2c'
    ..etc..
    

    我当前的搜索查询:

    select * from dbo.Items i
    LEFT JOIN dbo.tags t
    on i.ID = t.ID
    INNER JOIN @input in
    on (in.[input] = t.Tag or in.[input] is null)
    

    输入如下:

    DECLARE @input as inputTable_type
    INSERT INTO @input VALUES ('a1c')
    

    select * from dbo.Items i
    INNER JOIN dbo.tags t
    on i.ID = t.ID
    and t.Tag like ('a1%')
    

    不幸的是,我想保持它是一个静态查询,据我所知,我需要左连接-内部连接的组合,以便能够通过 VALUES (NULL) 进入存储过程。

    谢谢你的关心和帮助,如果我能澄清任何事情,请告诉我!

    2 回复  |  直到 14 年前
        1
  •  1
  •   Joe Stefanelli    14 年前

    而不是试图将“1%”存储在 @input

    select * 
        from dbo.Items i
            LEFT JOIN dbo.tags t
                INNER JOIN @input in
                    on in.[input] = left(t.Tag, len(in.[input]))
                on i.ID = t.ID
        where (t.ID is not null or not exists(select 1 from @input))
    
        2
  •  2
  •   Jonathan Leffler    14 年前

    既然你已经在外接桌上玩有趣的游戏了,为什么不延长游戏时间呢?最简单的版本是将等式替换为LIKE;下一个最简单的版本是添加OR术语:

    SELECT *
      FROM dbo.Items i
      LEFT JOIN dbo.tags t ON i.ID = t.ID
     INNER JOIN @input  in ON (t.Tag = in.[input] OR
                               t.Tag LIKE in.[input] OR
                               in.[input] IS NULL)
    

    下一个年级的复杂程度(或者我的意思是“复杂化”在@input表中添加第二列,指示要执行的比较:

    SELECT *
      FROM dbo.Items i
      LEFT JOIN dbo.tags t ON i.ID = t.ID
     INNER JOIN @input  in ON ((in.[type] = '=' AND t.Tag = in.[input]) OR
                               (in.[type] = '%' AND t.Tag LIKE in.[input]) OR
                               in.[input] IS NULL)
    

    推荐文章