powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / выборка значения ( LIKE наоборот )
19 сообщений из 19, страница 1 из 1
выборка значения ( LIKE наоборот )
    #33849574
burvinkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть база с примерно такой структурой.

ext | count

1234 100
12345 200


У меня есть значение 1234567.

Как мне сделать выборку из базы таким образом, чтобы я нашел одно значение которое максимально подходит под мою исхзодную строку.

Посути мое значение по начальным строкам совпадает со второй строкой базы.

Как мне сделать такой запрос , чтобы база тоже поняла это ?

Мне нужно чтобы это было реализовано только на уровне postgresql

Спасибо за ответ.
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33849589
burvinkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем нашел идею прошу помочь с реализацией.

Нужно число 1234567 разобрать по кускам и сделать запрос типа

select * from table where ext=1234567 or etx=123456 or ext=12345 or ext=1234 or ext=123 or ext=12 or ext=1 order by ext desc limit 1

Вот такой запрос нужно сделать .

А теперь просьба .
Ка кмн енаписать функцию , или запрос строкой, чтобы он это автоматизировал . ?
И сам разбирал номер , и формировал такую строку запроса?
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33849598
burvinkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CREATE OR REPLACE FUNCTION test0(
ext0 text
) RETURNS text AS $$

DECLARE
count0 integer := 0;
ask TEXT;
nxt TEXT;
tmp TEXT;
BEGIN
FOR count0 IN 1..length(ext0) LOOP
nxt := 'ext=' || substring(ext0 from 1 for count0);
ask := ask || ' or ' || nxt;

END LOOP;

RETURN ask;
END;


Сделал такую функцию , но при вызове выдает NULL .

В чем может быть загвоздка?

Если делаю эту (ask := ask || ' or ' || nxt;) строку такой - ask := ' or ' || nxt;


То оно мне просто выдает последнее значение цыкла, а почемуто строки не обединяет через весь цикл , помтгите пожлуйста.
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33849599
burvinkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще - как мне вызвать эту функцию внутри запроса ?
А то такое не помогает .


select * from tarif where || test0(100) || order by ext desc;
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33849610
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У типа поле ext какой тип данных имеет?

-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33849617
IgorNK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
arg := '1234567';
select max(ext) where strpos(arg, ext) =  1 ;
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33849652
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorNK
Код: plaintext
1.
arg := '1234567';
select max(ext) where strpos(arg, ext) =  1 ;
Такой вариант, к сожалению, не подразумевает использования индекса по полю ext, если таковой имеется.
Но в целом идея правильная - автору осталось только добавить сортировочку (убывающую) по длине значений ext е взять первую строку посредством limit.
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33849656
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимор Конев IgorNK
Код: plaintext
1.
arg := '1234567';
select max(ext) where strpos(arg, ext) =  1 ;
Такой вариант, к сожалению, не подразумевает использования индекса по полю ext, если таковой имеется.
Но в целом идея правильная - автору осталось только добавить сортировочку (убывающую) по длине значений ext е взять первую строку посредством limit.Ну и это, того - аггрегатную функцию надо нафиг выкинуть, ибо я больше чем уверен, что автору интереснее получить не само поле ext, а значение из поля count. :)
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33849846
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это уже обсуждалось
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33850520
IgorNK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владимор Конев ,
Выкинуть не выйдет, это ведь один из критериев - макс. соответствие. Можно уточнить, напр. так
Код: plaintext
select max(length(ext)) where strpos(arg, ext) =  1 
,
и для подмножества выбрать остальные нужные поля. Автору вопроса виднее, как результат использовать.
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33850630
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorNK Владимор Конев ,
Выкинуть не выйдет, это ведь один из критериев - макс. соответствие. Можно уточнить, напр. так
Код: plaintext
select max(length(ext)) where strpos(arg, ext) =  1 
,
и для подмножества выбрать остальные нужные поля. Автору вопроса виднее, как результат использовать.Очень даже выйдет :)
Уж если через limit нельзя будет сделать (это в случае, если на входе будетне одно конкретное значение 1234567, а целый список), то через коррелированный подзапрос точно можно будет реализовать
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33851639
burvinkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
select max(length(ext)) where strpos(arg, ext) = 1

Я чето не понял А куда это пихать применительно к моей фнкции????

Или можно ограничиться просто запросом?

Мне ведь нужно найти строку. А из строки вывести значение определенного столбца.
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33851936
IgorNK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот ваш вопрос из первого поста:
авторКак мне сделать выборку из базы таким образом, чтобы я нашел одно значение которое максимально подходит под мою исхзодную строку
Вот запрос, который должен вам это выдать:
Код: plaintext
select max(ext) into some_var where strpos('1234567', ext) =  1 ;
Далее по полученному значению some_var вы можете вытащить из строки то, что вам нужно.
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33852665
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Автор топика.
Ты так и не ответил на мой вопрос , поэтому я предполагаю, что у тебя поле ext имеет строковый тип (varchar, например)
Вот решение твоей задачи (это же типа биллинга? определить код направления, куда звонили, по набраному номеру):

ПУсть есть таблица calls со звонками:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select num_a, -- Кто звонил
       num_b  -- Куда звонил
  from calls 

Query finished, retrieving results...

NUM_A     NUM_B
-----   ----------
 1         7861299999  
 2         7861999999  
 3         7926199999  
 4         7926999999  
 5         9715099999  
 6         9719999999 

 6  row(s) retrieved

Пусть так же есть таблица с кодами и с тарифами по этим кодам:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select cod,   -- Код направления
       tarif, -- Тариф по данному направлению
       name   -- Название направления
  from tarif 

Query finished, retrieving results...

COD     TARIF              NAME
-----   -----   --------------------------
 78612        10    Краснодар
 7861         20    Краснодарский край
 79261        30    Москва, Мегафон
 7926         40    Россия моб.
 971          50    UNITED ARAB EMIRATES (FIX)
 97150        60    UNITED ARAB EMIRATES (MOB)

 6  row(s) retrieved

Вот запрос, который делает "тарификацию" разговоров, сопоставляю каждому звонку код направления по вызываемому номеру:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
select num_a, 
       num_b, 
       cod, 
       name, 
       tarif
  from tarif 
  join calls 
    on cod between substr(num_b, 1 , 1 ) 
               and num_b
   and position(cod, num_b) =  1 
   and char_length(cod) = (
                            select max(char_length(cod)) 
                              from tarif t
                             where cod between substr(num_b, 1 , 1 ) 
                                           and num_b
                               and position(cod, num_b) =  1 
                          )
order by num_a

Query finished, retrieving results...

NUM_A   NUM_B         COD    NAME                            TARIF
-----   ----------   -----   -----------------------------   -----
 1         7861299999     78612    Краснодар                           10  
 2         7861999999     7861     Краснодарский край                  20  
 3         7926199999     79261    Москва, Мегафон                     30  
 4         7926999999     7926     Россия моб.                         40  
 5         9715099999     97150    UNITED ARAB EMIRATES (MOB)          60  
 6         9719999999     971      UNITED ARAB EMIRATES (FIX)          50                                     

 6  row(s) retrieved


-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33852902
ilejn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот запрос, который делает "тарификацию" разговоров, сопоставляю каждому звонку код направления по вызываемому номеру:


А с какой скоростью эта конструкция работает в реальной жизни? Это ж ведь full scan, насколько я понимаю ...
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33852947
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilejn Вот запрос, который делает "тарификацию" разговоров, сопоставляю каждому звонку код направления по вызываемому номеру:


А с какой скоростью эта конструкция работает в реальной жизни? Это ж ведь full scan, насколько я понимаю ...Ну во-первых, использование индекса данная конструкция не исключает. А во-вторых, иногда и фуллскан бывает оправдан, все зависит от количества данных и от того, как они запрашиваются.

Более того, если нужно из таблицы (той, что приводил автор топика) выдергивать запись по внешнему передаваемому параметру (опять же, если вспомнить постановку задачи автором, то там ситуация такая - есть таблица, есть входной параметр, необходимо выбрать по этому параметру данные из таблицы, при условии, что "значение максимально подходит под мою исходную строку"), то такой вариант однозначно можно будет посадиьт на индекс, при условии что он (индекс, то бишь) в системе существует :)
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33852954
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilejn Вот запрос, который делает "тарификацию" разговоров, сопоставляю каждому звонку код направления по вызываемому номеру:


А с какой скоростью эта конструкция работает в реальной жизни? Это ж ведь full scan, насколько я понимаю ...Кстати, никто тебе не мешает сделать простенький тестик на предмет выяснения быстродействия этой конструкции :)
По крайней мере на моем серваке такое работает за милую душу :) И индексы использует без дополнительных телодвижений с моей стороны.
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33856022
burvinkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасиба всем разобрался меня устроит вариант с select max(ext) where strpos(arg, ext) = 1;

Но есть теперь новая проблема.

Ща топик создам.
...
Рейтинг: 0 / 0
выборка значения ( LIKE наоборот )
    #33856794
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burvinkleСпасиба всем разобрался меня устроит вариант с select max(ext) where strpos(arg, ext) = 1;

Но есть теперь новая проблема.

Ща топик создам.А вот такую конструкцию на индекс не посадишь.
Будет идти полное сканирование таблицы. Можно, конечно, заменить полным сканированием индекса по полю ext, но это будет всё равно не то :)
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / выборка значения ( LIKE наоборот )
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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