1

良い一日。

最初に私はクエリを持っています:

   ;
    WITH ranked AS (
      SELECT
        p.id_price as p_id_price, 
        p.id_service as p_id_service, 
        p.name as p_name, 
        p.name_original as p_name_original, 
        p.id_producer_country as p_id_producer_country, 
        p.id_firm as p_id_firm, 
        f.name as f_name, 
        f.address as f_address, 
        f.phone as f_phone, 
        city.name as city_name, 
        pc.name as pc_name,
        ROW_NUMBER() OVER (
          PARTITION BY p.id_firm
          ORDER BY
            CASE  -- this criterion puts matching products before non-matching ones
              WHEN p.name like '%test%' COLLATE SQL_Latin1_General_Cp1251_CI_AS
              THEN 1 ELSE 2
            END,
            p.id_price  -- you may use any sorting criteria at this point,
                        -- just ensure it makes the results predictable
        ) AS rnk
      FROM Price p 
      left join Firm f 
        on f.id_service=p.id_service 
        AND f.id_city=p.id_city 
        AND f.id_firm=p.id_firm 
      left join City city 
        on city.id_city = p.id_city 
      left join Producer_country pc 
        on pc.id_producer_country = p.id_producer_country 
      WHERE p.id_city='73041' 
        AND p.include='1' 
        AND p.blocked='0' 
        AND f.blocked='0' 
        AND ( f.name like '%test%' COLLATE SQL_Latin1_General_Cp1251_CI_AS
           OR p.name like '%test%' COLLATE SQL_Latin1_General_Cp1251_CI_AS )
    )
    SELECT *
    FROM ranked
    WHERE rnk = 1 
ORDER  BY CASE WHEN f_name LIKE '%$..' THEN 0 ELSE 1 END,
              f_name
        ;

ORDER BYが機能しませんでした:

結果

ここの構造テーブル

$記号の後に昇順でf_nameソートする必要があります

ORDER BYなぜ期待どおりに動作しなかったのですか?

4

2 に答える 2

4

f.nameWITH句でのみ有効です。レコードを再度注文する場合は、提供されているエイリアスを使用してください。

CASE WHEN f_name LIKE '%$..' THEN 0 ELSE 1 END
于 2013-03-24T06:17:40.187 に答える
2

さらに議論した後、2つの方法で同じ文字列を並べ替える必要があることに気付きました。最初に文字が含まれている場合は、$次に文字の後に存在する文字列が続き$ます。次のORDER BYようになります。

ORDER BY 
  CASE WHEN f_name LIKE '%$%' THEN 0 ELSE 1 END, 
  SUBSTRING (name ,CHARINDEX('$' , name)+1, (LEN(name)) - CHARINDEX('$', name) ASC
于 2013-03-24T07:18:09.897 に答える