美好的一天。
首先我有疑问:
;
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不起作用:
我需要在$ sign
之后按升序排序为什么ORDER BY
没有按预期行事?
答案 0 :(得分:4)
f.name
仅对WITH
子句有效。如果要再次订购记录,请使用提供的别名
CASE WHEN f_name LIKE '%$..' THEN 0 ELSE 1 END
答案 1 :(得分: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