У меня есть требования извлекать мобильные номера пользователей из базы данных без дубликатов, поэтому для этого я использую отдельное ключевое слово.
Также не все мобильные номера имеют хороший формат, поэтомуЯ использую 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
ОБНОВЛЕНИЕ
Как и предполагал Металл, я использую 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