Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Значение между / 24 сообщений из 24, страница 1 из 1
08.10.2020, 20:26
    #40006718
Palkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
Привет.
Подскажите как проверить есть ли телефон из таблицы 1 791231231212
в промежутках между полем phone1 (значение 79000000000) и phone2 (значение 79000061999) в таблице 2
Таких строк со значениями 7929
Если делать case то ms sql вылетает, потому что слишком много строк в запросе.

Нужен вывод: поле phone и значение Y(если есть) или N (если нет)

В аттаче таблица с промежутками чтобы было понимание
...
Рейтинг: 0 / 0
08.10.2020, 21:10
    #40006727
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
Palkin
Если делать case то ms sql вылетает, потому что слишком много строк в запросе.
Вы запрос покажите, непонятно, откуда там "case" и "слишком много строк"

Palkin
Таких строк со значениями 7929
Как это?
в любом случае 791 больше 790, так что не попадает ни одной строки

Лучше вместо непонятного файла выложите сюда запрос, и пяток строк данных.
...
Рейтинг: 0 / 0
08.10.2020, 21:47
    #40006737
Palkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
alexeyvg
Palkin
Если делать case то ms sql вылетает, потому что слишком много строк в запросе.
Вы запрос покажите, непонятно, откуда там "case" и "слишком много строк"

Palkin
Таких строк со значениями 7929
Как это?
в любом случае 791 больше 790, так что не попадает ни одной строки

Лучше вместо непонятного файла выложите сюда запрос, и пяток строк данных.


С данными одна таблица с телефонами, которые нужно проверить на валидность, если телефон есть между значениями, которые я прикрепил в таблице то он валидный. Вот пример запроса


SELECT phone,
case
when phone between 79000000000 and 79000061999 then 'y'
when phone between 79000062000 and 79000062999 then 'y'
when phone between 79000063000 and 79000099999 then 'y'
when phone between 79000100000 and 79000199999 then 'y'
when phone between 79000200000 and 79000299999 then 'y'


и так 7 тысяч строк


else 'n'
End
from [dbo].[all_phopne]
...
Рейтинг: 0 / 0
08.10.2020, 22:04
    #40006740
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
Palkin,

закинь эти диапазоны во времянку, и

Код: sql
1.
2.
3.
4.
select 
    a.phone, case when b.num_start is null then 'n' else 'y' as xz
from [dbo].[all_phopne] a 
left join #temp b on a.phone between b.num_start and b.num_finish 
...
Рейтинг: 0 / 0
08.10.2020, 22:07
    #40006741
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
Palkin
С данными одна таблица с телефонами, которые нужно проверить на валидность, если телефон есть между значениями, которые я прикрепил в таблице то он валидный. Вот пример запроса
Так вы вставьте данные из той "таблицы, которую прикрепили", в таблицу, и тогда получится простой запрос из двух таблиц, например, такой:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT phone,
    case 
        when exists(
            select 1 from [dbo].[phopne] as p where a.phone between p.phone_from and p.phone_to
        ) then 'y' 
        else 'n' 
    End
from [dbo].[all_phopne] as a


Или можно написать по другому, если нужна информация, к какому именно диапазону принадлежит телефон.
...
Рейтинг: 0 / 0
08.10.2020, 22:08
    #40006742
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
court
закинь эти диапазоны во времянку, и
Это же словарь, совершенно необязательно писать его в клиентский код, и передавать каждый раз в запрос :-)
...
Рейтинг: 0 / 0
08.10.2020, 22:38
    #40006750
Palkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
alexeyvg
Palkin
С данными одна таблица с телефонами, которые нужно проверить на валидность, если телефон есть между значениями, которые я прикрепил в таблице то он валидный. Вот пример запроса
Так вы вставьте данные из той "таблицы, которую прикрепили", в таблицу, и тогда получится простой запрос из двух таблиц, например, такой:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT phone,
    case 
        when exists(
            select 1 from [dbo].[phopne] as p where a.phone between p.phone_from and p.phone_to
        ) then 'y' 
        else 'n' 
    End
from [dbo].[all_phopne] as a


Или можно написать по другому, если нужна информация, к какому именно диапазону принадлежит телефон.


Не получается, везде выводит n

Не знаю как тут картинки под спойлер прятать
Тут скрин
https://yadi.sk/i/3ay1sTS5NwypAw
...
Рейтинг: 0 / 0
08.10.2020, 22:46
    #40006754
Palkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
alexeyvg
court
закинь эти диапазоны во времянку, и
Это же словарь, совершенно необязательно писать его в клиентский код, и передавать каждый раз в запрос :-)



А вот так выглядят таблицы:

https://yadi.sk/i/3EXLwqv4Y8ng0g
...
Рейтинг: 0 / 0
08.10.2020, 22:49
    #40006755
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
Palkin,

напишите левый джойн с таблицей диапазонов, если первая граница диапазона not null, то пишите Y, иначе N.
...
Рейтинг: 0 / 0
08.10.2020, 22:54
    #40006756
Palkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
Владислав Колосов
Palkin,

напишите левый джойн с таблицей диапазонов, если первая граница диапазона not null, то пишите Y, иначе N.



телефон должен проверяться в дипазоне. Например мне нужно понять есть ли цифра 5 в диапазоне
1-10
10-20
20-30
30-40
.......

Цифра 5 есть в 1 диапазоне, соответсвенно ответ y

Только как вот between сделать внутри диапазона и если нет в этом диапазоне, то перейти на следющий.
Превдолагаю что нужно использовать lag и row_number, но как прикрутить ума не приложу
...
Рейтинг: 0 / 0
09.10.2020, 06:42
    #40006790
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
Palkin
Не получается, везде выводит n

Ясен пень, ведь у вас проверка не верная, судя по картинке:
Код: sql
1.
where a.phone2 between p.phone1 and p.phone1
...
Рейтинг: 0 / 0
09.10.2020, 09:16
    #40006821
Palkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
skyANA
Palkin
Не получается, везде выводит n

Ясен пень, ведь у вас проверка не верная, судя по картинке:
Код: sql
1.
where a.phone2 between p.phone1 and p.phone1



Да, все получилось, спасибо!
...
Рейтинг: 0 / 0
09.10.2020, 10:14
    #40006839
Аленочка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
а через функцию не пробовали ? ) вдруг быстрее выйдет чем джоины
...
Рейтинг: 0 / 0
09.10.2020, 10:22
    #40006842
Аленочка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
и зачем вам все 7000 строк, может лишние отсечь перед проверкой, все те что до 79000299999, я так понимаю поле числовое...индексы есть какие то?
...
Рейтинг: 0 / 0
09.10.2020, 11:14
    #40006861
Агрох
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
[quot Palkin#22211111]
Вопрос, чем это:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT phone,
case
when phone between 79000000000 and 79000061999 then 'y'
when phone between 79000062000 and 79000062999 then 'y'
when phone between 79000063000 and 79000099999 then 'y'
when phone between 79000100000 and 79000199999 then 'y'
when phone between 79000200000 and 79000299999 then 'y'


и так 7 тысяч строк


else 'n'
End
from [dbo].[all_phopne]



Отличается от этого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT phone,
case
when phone between 79000000000 and 79000299999 then 'y'


и так 7 тысяч строк


else 'n'
End
from [dbo].[all_phopne]



???

Я так подозреваю, что один большой диапазон, зачем то, разбит на кучу маленьких. Допускаю что для каких то других процессов это может быть необходимо, но в данном случае гораздо оптимальнее сначала слить такие непрерывные диапазоны в один большой и уже его проверять битвином.

А если у вас идёт проверка "Телефон российских операторов сотовой связи" = "y", "Телефон операторов сотовой связи других стран" = "n", то ещё лучше проверять вообще только первые 4 цифры ибо "Телефон российских операторов сотовой связи" это "+7 (9NN) XXX XX XX"/
...
Рейтинг: 0 / 0
09.10.2020, 11:15
    #40006862
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
Palkin
Не получается, везде выводит n
И должно быть n, всё правильно. Я вам про это уже писал.
...
Рейтинг: 0 / 0
24.10.2020, 01:41
    #40011472
Palkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
Народ, у кого есть такая же потребность - решил сл. кодом:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT phone,
    case 
        when exists(
            select 1 from [dbo].[phopne] as p where a.phone between p.phone_from and p.phone_to
        ) then 'y' 
        else 'n' 
    End
from [dbo].[all_phopne] as a



Смысл всего этого: качаю актуальный список телефонов на сайте минкомсвязи https://rossvyaz.gov.ru/deyatelnost/resurs-numeracii/vypiska-iz-reestra-sistemy-i-plana-numeracii и с помощью запроса выше, смотрю валиден ли телефон. Это нужно для того чтобы в клиентскую базу попадали верные телефоны
...
Рейтинг: 0 / 0
24.10.2020, 11:45
    #40011511
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
Palkin
качаю актуальный список телефонов на сайте минкомсвязи https://rossvyaz.gov.ru/deyatelnost/resurs-numeracii/vypiska-iz-reestra-sistemy-i-plana-numeracii и с помощью запроса выше, смотрю валиден ли телефон.
Актуальный список не актуальный, мой телефон приписал к другому оператору :-)
Хотя на валидность он наверняка достаточно достоверен.
...
Рейтинг: 0 / 0
24.10.2020, 12:20
    #40011518
Palkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
alexeyvg,


Оператор не важен, главное чтобы номер валиден был.
Т.е. когда клиент регистрируется и пытается вбить левый номер, система будет ругаться и даст ему ввести невалидный номер, тем самым не давай "засираться" базе недействительными телефонами.
...
Рейтинг: 0 / 0
24.10.2020, 14:15
    #40011533
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
Palkin,

автортелефон должен проверяться в дипазоне. Например мне нужно понять есть ли цифра 5 в диапазоне
1-10
10-20
20-30
30-40
.......

Цифра 5 есть в 1 диапазоне, соответсвенно ответ y

Не надо никуда переходить, просмотрите все диапазоны и используйте max (Y/N). Если номер попал хотя бы в один из диапазонов получите Y. Y > N.
...
Рейтинг: 0 / 0
24.10.2020, 21:28
    #40011599
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
Владислав Колосов
используйте max
Разве exists не эффективнее?
...
Рейтинг: 0 / 0
24.10.2020, 22:09
    #40011604
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
Palkin
alexeyvg,


Оператор не важен, главное чтобы номер валиден был.
Т.е. когда клиент регистрируется и пытается вбить левый номер, система будет ругаться и даст ему ввести невалидный номер, тем самым не давай "засираться" базе недействительными телефонами.
тогда будут вводить что-то вроде 7978-111-11-11
...
Рейтинг: 0 / 0
24.10.2020, 22:52
    #40011607
Дикий Билл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
Palkin
Владислав Колосов
Palkin,

напишите левый джойн с таблицей диапазонов, если первая граница диапазона not null, то пишите Y, иначе N.



телефон должен проверяться в дипазоне. Например мне нужно понять есть ли цифра 5 в диапазоне
1-10
10-20
20-30
30-40
.......

Цифра 5 есть в 1 диапазоне, соответсвенно ответ y

Только как вот between сделать внутри диапазона и если нет в этом диапазоне, то перейти на следющий.
Превдолагаю что нужно использовать lag и row_number, но как прикрутить ума не приложу


а если в диапазоне 1 - 40, это не то же самое?
...
Рейтинг: 0 / 0
25.10.2020, 01:16
    #40011622
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение между
Palkin

SELECT phone,
case
when phone between 79000000000 and 79000061999 then 'y'
when phone between 79000062000 and 79000062999 then 'y'
when phone between 79000063000 and 79000099999 then 'y'
when phone between 79000100000 and 79000199999 then 'y'
when phone between 79000200000 and 79000299999 then 'y'


и так 7 тысяч строк
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Значение между / 24 сообщений из 24, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]