in по множеству в текстовом поле

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....


может есть штатный способ сообщить что текстовое значение это на самом деле множество значений перечисленных через запятую?
Winnipuh
Дата: 22.05.2015 10:29:54
при таком (неоправданном) формате поля можно конечно прилепить запятую слева и справа в поле и искать типа

like '%,7,%'

или преобразовывать в массив.
Legushka
Дата: 22.05.2015 10:51:15
Winnipuh , спасибо, буду пробовать два способа, кто быстрее будет работать
vaneque
Дата: 22.05.2015 13:16:04
Winnipuh,

плохой вариант, т.к. 7-й дом может быть перечислен в начале или в конце
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-й дом может быть перечислен в начале или в конце
p2.
Дата: 22.05.2015 13:38:04
vaneque
но думаю должен быть вариант грамотнее
дописать запятые в начале и конце, а like заменить на strpos
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 будет шустрее работать
Winnipuh
Дата: 22.05.2015 15:18:01
vaneque
Winnipuh,

плохой вариант, т.к. 7-й дом может быть перечислен в начале или в конце


я имел в виду значение поля

при таком (неоправданном) формате поля можно конечно прилепить запятую слева и справа в поле и искать

чтобы всегда поле было

,22,33,,77,88,
,5,6,33,3,
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[]);