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

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

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

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

Лучше вместо непонятного файла выложите сюда запрос, и пяток строк данных.
...
Рейтинг: 0 / 0
Значение между
    #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
Значение между
    #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
Значение между
    #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
Значение между
    #40006742
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court
закинь эти диапазоны во времянку, и
Это же словарь, совершенно необязательно писать его в клиентский код, и передавать каждый раз в запрос :-)
...
Рейтинг: 0 / 0
Значение между
    #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
Значение между
    #40006754
Palkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
court
закинь эти диапазоны во времянку, и
Это же словарь, совершенно необязательно писать его в клиентский код, и передавать каждый раз в запрос :-)



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

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

напишите левый джойн с таблицей диапазонов, если первая граница диапазона not null, то пишите Y, иначе N.
...
Рейтинг: 0 / 0
Значение между
    #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
Значение между
    #40006790
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Palkin
Не получается, везде выводит n

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

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



Да, все получилось, спасибо!
...
Рейтинг: 0 / 0
Значение между
    #40006839
Фотография Аленочка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а через функцию не пробовали ? ) вдруг быстрее выйдет чем джоины
...
Рейтинг: 0 / 0
Значение между
    #40006842
Фотография Аленочка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и зачем вам все 7000 строк, может лишние отсечь перед проверкой, все те что до 79000299999, я так понимаю поле числовое...индексы есть какие то?
...
Рейтинг: 0 / 0
Значение между
    #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
Значение между
    #40006862
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Palkin
Не получается, везде выводит n
И должно быть n, всё правильно. Я вам про это уже писал.
...
Рейтинг: 0 / 0
Значение между
    #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
Значение между
    #40011511
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Palkin
качаю актуальный список телефонов на сайте минкомсвязи https://rossvyaz.gov.ru/deyatelnost/resurs-numeracii/vypiska-iz-reestra-sistemy-i-plana-numeracii и с помощью запроса выше, смотрю валиден ли телефон.
Актуальный список не актуальный, мой телефон приписал к другому оператору :-)
Хотя на валидность он наверняка достаточно достоверен.
...
Рейтинг: 0 / 0
Значение между
    #40011518
Palkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,


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

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

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

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


Оператор не важен, главное чтобы номер валиден был.
Т.е. когда клиент регистрируется и пытается вбить левый номер, система будет ругаться и даст ему ввести невалидный номер, тем самым не давай "засираться" базе недействительными телефонами.
тогда будут вводить что-то вроде 7978-111-11-11
...
Рейтинг: 0 / 0
Значение между
    #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
Значение между
    #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
24 сообщений из 24, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Значение между
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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