【发布时间】:2019-11-21 05:49:11
【问题描述】:
我需要从数据库中检索没有重复的用户手机号码,所以我使用 distinct 关键字来做到这一点。
此外,并非所有手机号码的格式都很好,所以我使用 Case 来格式化号码。
最后我想获取最新的 500 个手机号码,所以我想通过 Order by ID desc 进行排序,但它显示了
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.
下面是我的查询
select distinct top 500 case
when len(PhoneNumber) = 13 And phoneNumber like '+311%' then replace(PhoneNumber, '+311', '0')
when len(PhoneNumber) = 13 And phoneNumber like '311-%' then replace(PhoneNumber, '311-', '0')
when len(PhoneNumber) = 13 And phoneNumber like '0311%' then stuff(PhoneNumber, 1, 4 , 0 )
when len(PhoneNumber) = 14 And phoneNumber like '00311%'then stuff(PhoneNumber, 1, 5 ,'0')
when len(PhoneNumber) = 14 And phoneNumber like '00311%' then stuff(PhoneNumber, 1, 4 ,'0')
when len(PhoneNumber) = 12 And phoneNumber like '311%' then stuff(PhoneNumber, 1 , 3 , '0')
when len(PhoneNumber) = 12 then REPLACE (PhoneNumber, '-', '')
when len(PhoneNumber) = 11 And phoneNumber like '00%' then Stuff(PhoneNumber, 1, 2 , '0')
else PhoneNumber
end
from users where cityid = 1 and statusid = 1 and (len(PhoneNumber) >= 10 And len(PhoneNumber) <= 14)
and PhoneNumber not like '"%' and PhoneNumber not like '+311-%' and PhoneNumber not like '01%'
and PhoneNumber like '0%'
Order by id
更新
正如 Metal 所建议的,我正在使用 row_number() 并通过它进行分区给我一个手机号码,这是不正确的结果
select top 500000 Mobile
from
(select
row_number() over (partition by PhoneNumber order by id desc) rn,
case
when len(PhoneNumber) = 13 And phoneNumber like '+966%' then replace(PhoneNumber, '+966', '0')
when len(PhoneNumber) = 13 And phoneNumber like '966-%' then replace(PhoneNumber, '966-', '0')
when len(PhoneNumber) = 13 And phoneNumber like '0966%' then stuff(PhoneNumber, 1, 4 , 0 )
when len(PhoneNumber) = 14 And phoneNumber like '00966%'then stuff(PhoneNumber, 1, 5 ,'0')
when len(PhoneNumber) = 14 And phoneNumber like '0096%' then stuff(PhoneNumber, 1, 4 ,'0')
when len(PhoneNumber) = 12 And phoneNumber like '966%' then stuff(PhoneNumber, 1 , 3 , '0')
when len(PhoneNumber) = 12 then REPLACE (PhoneNumber, '-', '')
when len(PhoneNumber) = 11 And phoneNumber like '00%' then Stuff(PhoneNumber, 1, 2 , '0')
else PhoneNumber
end as Mobile
from consigneeDetail
where cityid = 1 and statusid = 1 and (len(PhoneNumber) >= 10 And len(PhoneNumber) <= 14)
and PhoneNumber not like '"%' and PhoneNumber not like '+966-%' and PhoneNumber not like '01%'
and PhoneNumber like '0%') t1
where rn = 1
【问题讨论】:
标签: mysql sql database case distinct