powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / operator does not exist: integer ~~ unknown
6 сообщений из 6, страница 1 из 1
operator does not exist: integer ~~ unknown
    #38748899
VanillaNInja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята, подскажите, чего оно от меня хочет и чего ему не нравится?
Код: plsql
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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
DO
	$$
DECLARE i INT ; rc RECORD ; rc2 TEXT ; _interval_start INT ; _interval_end INT ; _temp_array TEXT [];
BEGIN
	CREATE TABLE tmp_district_ch_1509 (
		ID int,
		address_id int,
		district_id int,
		building_pattern TEXT []
	) ; INSERT INTO tmp_district_ch_1509 (
		ID,
		address_id,
		district_id,
		building_pattern
	) SELECT
		ID,
		address_id,
		district_id,
		String_To_Array(mda.building_pattern, ',')
	FROM
		md_district_address mda ; 
    ALTER TABLE tmp_district_ch_1509 ADD buildings_list TEXT [];
    FOR rc IN ( SELECT	*	FROM tmp_district_ch_1509)
    LOOP
	BEGIN
		CASE
	WHEN array_lower(rc.building_pattern, 1) IS NULL THEN
		CONTINUE ;
	ELSE
		FOR rc2 IN (array_lower(rc.building_pattern , 1 ))..array_upper(rc.building_pattern, 1) LOOP
	BEGIN
		CASE
	WHEN rc2 LIKE ('%Ч(%') THEN
		_interval_start := CAST( (
			String_To_Array(
				regexp_replace(rc, 'Ч(|)', ''),
				'-'
			)
		) [ 1 ] as int) ; _interval_end := cast( (
			String_To_Array(
				regexp_replace(rc, 'Ч(|)', ''),
				'-'
			)
		) [ 2 ] as int); while (
			_interval_start < _interval_end
		) LOOP
	BEGIN
		_interval_start := _interval_start + 2 ; _temp_array := array_append(
			_temp_array,
			_interval_start
		) ;
	END ;
	END LOOP ;
	WHEN rc2 LIKE ('%Н()%') THEN
		_interval_start := cast( (
			String_To_Array(
				regexp_replace(rc, 'Н(|)', ''),
				'-'
			)
		) [ 1 ] as int) ; _interval_end := Cast((
			String_To_Array(
				regexp_replace(rc, 'Н(|)', ''),
				'-'
			)
		) [ 2 ] as int) ; while (
			_interval_start < _interval_end
		) loop
	BEGIN
		_interval_start := _interval_start + 2 ; _temp_array := array_append(
			_temp_array,
			_interval_start
		) ;
	END ;
	END loop ;
	WHEN rc2 LIKE ('%-%') THEN
		_interval_start := (String_To_Array(rc, '-')) [ 1 ] ; _interval_end := (String_To_Array(rc, '-')) [ 2 ] ; while (
			_interval_start < _interval_end
		) loop
	BEGIN
		_interval_start := _interval_start + 1 ; _temp_array := array_append(
			_temp_array,
			_interval_start
		) ;
	END ;
	END loop ;
            	
	WHEN UPPER (rc2) LIKE ('%ВСЕ%%') THEN
		_temp_array [ 1 ]:= 'ALL' ;
	ELSE
		_temp_array := array_append(_temp_array, rc2) ;
	END CASE ;
	END ;
	END LOOP ;

	END CASE ;
        END;
	END LOOP ; 
    
    SELECT
		*
	FROM
		_temp_array ; DROP TABLE tmp_district_ch_1509 ; END$$;



Код: plsql
1.
2.
3.
4.
5.
6.
[Err] ERROR:  operator does not exist: integer ~~ unknown
LINE 1: SELECT rc2 LIKE ('%Ч(%')
                   ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
QUERY:  SELECT rc2 LIKE ('%Ч(%')
CONTEXT:  PL/pgSQL function inline_code_block line 31 at CASE


заранее спасибо :-)
...
Рейтинг: 0 / 0
operator does not exist: integer ~~ unknown
    #38748912
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VanillaNInja,

вы решите уж rc2 у вас TEXT или INTEGER
так как с одной стороны rc2 TEXT
с другой стороы из rc2 IN (array_lower(rc.building_pattern , 1 ))..array_upper(rc.building_pattern, 1) следует что он INTEGER
и судя по смыслу у вас ошибка в коде... array_upper/array_lower это индексы в массиве... а не его элементы...
и по ним делать rc2 LIKE ('%Ч(%') смысла мало...
о чем вам база и говорит...
если вам очень очень надо LIKE от integer сделать тогда напишите
rc2::text LIKE ('%Ч(%')
но вряд ли это то что вам надо

--Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
operator does not exist: integer ~~ unknown
    #38748926
VanillaNInja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, спасибо. неверно истолковал значение array_lower. То есть получается в PgSQL не перебрать текстовый массив For'ом?
Сидим на 9.0, foreach'a нету :-/
...
Рейтинг: 0 / 0
operator does not exist: integer ~~ unknown
    #38748934
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VanillaNInjaДа, спасибо. неверно истолковал значение array_lower. То есть получается в PgSQL не перебрать текстовый массив For'ом?
Сидим на 9.0, foreach'a нету :-/

скорее всего как то так:

- WHEN rc2 LIKE ('%Ч(%') THEN
+ WHEN rc.building_pattern[rc2] LIKE ('%Ч(%') THEN

--Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
operator does not exist: integer ~~ unknown
    #38748943
VanillaNInja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, вы правы.
Огромное спасибо.
...
Рейтинг: 0 / 0
operator does not exist: integer ~~ unknown
    #38748969
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VanillaNInjaДа, спасибо. неверно истолковал значение array_lower. То есть получается в PgSQL не перебрать текстовый массив For'ом?
Сидим на 9.0, foreach'a нету :-/
unnest есть.
и да, т.к. все передачи параметров в пж [sql|plpgsql] -- по значению, умно покрутить набор из-под unnesta может оказаться сильно дешевле, чем несколько раз передать массив в ф--ии вида array_lower(), array_аппер() и т.п..
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / operator does not exist: integer ~~ unknown
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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