【问题标题】:Get Match Data On top在顶部获取匹配数据
【发布时间】:2014-06-27 06:52:19
【问题描述】:

我在不同的列上有多个类似的运算符,如下所示:

SELECT d.ID ,d.DealerCode,d.AffiliationCode,d.LegalName,d.ShipperCode,d.PrimaryUserId,d.PrimaryContactId,              
       FROM Dealer AS d              
       LEFT JOIN Country c on c.Id=d.CountryId              
       LEFT JOIN [User] u on u.Id=d.PrimaryUserId              
       LEFT JOIN RegistrationSource rs on rs.Id=d.RegistrationSourceId              
       WHERE d.TenantId='4c0a42de-6ce5-4faa-8b5d-da4d7c3294b4' AND 
       (
        u.UserName LIKE '%AQ%' 
        OR d.DealerCode LIKE '%AQ%' 
        OR d.LegalName LIKE '%AQ%' 
        OR d.ShipperCode LIKE '%AQ%'
       ) 
       ORDER BY d.DealerCode ASC

是否有可能首先(在顶部)找到与这些列值中的任何一个具有完全匹配值的行集

【问题讨论】:

  • 替换LIKE '%AQ%' 上的= 'AQ'?

标签: sql sql-server stored-procedures


【解决方案1】:

尝试一个 UNION - 它应该允许您一个接一个地列出两组数据(未经测试):

SELECT d.ID 
       ,d.DealerCode,d.AffiliationCode,d.LegalName, ...
   FROM Dealer AS d              
   LEFT JOIN Country c on c.Id=d.CountryId              
   LEFT JOIN [User] u on u.Id=d.PrimaryUserId              
   LEFT JOIN RegistrationSource rs on rs.Id=d.RegistrationSourceId              
   WHERE d.TenantId='4c0a42de-6ce5-4faa-8b5d-da4d7c3294b4' AND 
   (
    u.UserName = 'AQ' 
    OR d.DealerCode = 'AQ' 
    OR d.LegalName = 'AQ' 
    OR d.ShipperCode = 'AQ'
   ) 
UNION
   SELECT d.ID , d.DealerCode,d.AffiliationCode, ...
   FROM Dealer AS d              
   LEFT JOIN Country c on c.Id=d.CountryId              
   LEFT JOIN [User] u on u.Id=d.PrimaryUserId              
   LEFT JOIN RegistrationSource rs on rs.Id=d.RegistrationSourceId              
   WHERE d.TenantId='4c0a42de-6ce5-4faa-8b5d-da4d7c3294b4' AND 
   (
    u.UserName LIKE '%AQ%' 
    OR d.DealerCode LIKE '%AQ%' 
    OR d.LegalName LIKE '%AQ%' 
    OR d.ShipperCode LIKE '%AQ%'
   ) 
   ORDER BY d.DealerCode ASC

如果有多个“第一个”,您可能需要限制使用 TOP 1

【讨论】:

    【解决方案2】:

    您可以使用ORDER BY 使完全匹配的行显示在顶部,例如:

    ......
    ......
    ORDER BY
        (CASE WHEN 
            u.UserName = 'AQ' 
            OR d.DealerCode = 'AQ' 
            OR d.LegalName = 'AQ' 
            OR d.ShipperCode = 'AQ'
        THEN 0
        ELSE 1
        END), d.DealerCode
    

    相关问题:MySQL order by "best match"

    【讨论】:

      【解决方案3】:

      声明@OrderByFeild VarChar(25)
      声明@OrderByOrder VarChar(5)

      SELECT @OrderByFeild = SUBSTRING(@OrderBy, 1, CHARINDEX(' ', @OrderBy) - 1),
      @OrderByOrder = SUBSTRING(@OrderBy, CHARINDEX(' ', @OrderBy) + 1, LEN(@OrderBy))

      如果 @OrderByFeild = 'DealerCode' 和 @OrderByOrder = 'ASC' 开始

      --Your Select Statement Here..
          ORDER BY CASE 
           WHEN d.DealerCode LIKE ''+@SearchQuery+''  THEN 5 
           WHEN d.DealerCode LIKE '%'+@SearchQuery+'%' THEN 4 
           WHEN u.UserName LIKE '%'+@SearchQuery+'%' THEN 3 
           WHEN d.LegalName LIKE '%'+@SearchQuery+'%' THEN 2
           WHEN d.ShipperCode LIKE '%'+@SearchQuery+'%' THEN 1   END
      END
      

      ELSE IF @OrderByFeild = 'DealerCode' 开始

      --Your Select Statement Here..
          ORDER BY CASE 
           WHEN d.DealerCode LIKE ''+@SearchQuery+''  THEN 1 
           WHEN d.DealerCode LIKE '%'+@SearchQuery+'%' THEN 2 
           WHEN u.UserName LIKE '%'+@SearchQuery+'%' THEN 3 
           WHEN d.LegalName LIKE '%'+@SearchQuery+'%' THEN 4
           WHEN d.ShipperCode LIKE '%'+@SearchQuery+'%' THEN 5   END
      
      END
      

      否则 开始

          --Your Select Statement Here..
          -- ANY Other sorting you need to do
      END
      

      【讨论】:

        猜你喜欢
        • 2020-02-01
        • 2012-12-27
        • 2012-03-26
        • 2013-12-19
        • 1970-01-01
        • 2021-09-18
        • 1970-01-01
        • 2022-07-07
        • 2022-08-12
        相关资源
        最近更新 更多