Legushka
Дата: 22.05.2015 09:59:32
добрый день.
в таблице в одном поле DOM хранятся дома через запятую без пробелов
"1,10/8,3,4,5,6,7"
"13а,15,16/15,17,19,19а,19в,20/12,20а,20б"
"22,23,25,26/5,27,28,29,31,32,33,33а,33б"
"33в,34,35,36,37,38,39,40,41,42,43,43а,45"
"46,47,49,51,53,55,57,58,59,61,67,69"
если искать вхождение дома 23 по строке то выйдет третяя строка
но допустим мне надо найти все записи с номером дома 7?
пробую достать через лайк - выходят и 7ка и строки где 47 и 37....
может есть штатный способ сообщить что текстовое значение это на самом деле множество значений перечисленных через запятую?
vaneque
Дата: 22.05.2015 13:28:54
имею в виду like '%,7,%'
тогда уже
with t(house_numbers)
as
(
select '1,2,3,4,5,6,7,8,9'
union
select '4,5,6,7,8,9,10,11'
union
select '8,9,10,11,12,13,14,15'
union
select '7,12,456,789,2'
union
select '23,45,67'
union
select '23,45,67,7'
union
select '77'
union
select '777'
)
select * from t where house_numbers like '%,7,%' or house_numbers like '7,%' or house_numbers like '%,7';
это будет работать, но думаю должен быть вариант грамотнее
vaneque |
---|
Winnipuh,
плохой вариант, т.к. 7-й дом может быть перечислен в начале или в конце |
vaneque
Дата: 22.05.2015 13:42:25
Legushka,
можно так:
with data(house_numbers) as
(
select '1,2,3,4,5,6,7,8,9'
union
select '4,5,6,7,8,9,10,11'
union
select '8,9,10,11,12,13,14,15'
union
select '7,12,456,789,2'
union
select '23,45,67'
union
select '23,45,67,7'
union
select '77'
union
select '777'
)
select house_numbers from data where '7' = ANY (String_To_Array(house_numbers, ',')::int[]);
в плане скорости выполнения скрипта надо уже смотреть, но наверно с like будет шустрее работать
drsm
Дата: 22.05.2015 15:27:59
как-то так может )
with t(house_numbers)
as
(
select '1,2,3,4,5,6,7,8,9'
union
select '4,5,6,7,8,9,10,11'
union
select '8,9,10,11,12,13,14,15'
union
select '7,12,456,789,2'
union
select '23,45,67'
union
select '23,45,67,7'
union
select '77'
union
select '777'
)
select * from t where '7' = any(('{' || house_numbers || '}')::text[]);