powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / isnumeric
10 сообщений из 10, страница 1 из 1
isnumeric
    #37529600
ARTURV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день уважаемые коллеги

Во всех СУБД, с которыми работал, была функция isnumeric для проверки - является ли текст числом.
В PostgreSQL не нашел. Может быть здесь надо делать проверку по другому
...
Рейтинг: 0 / 0
isnumeric
    #37529652
Фотография SmeL_md
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
CREATE FUNCTION isnumeric(text) RETURNS boolean AS '
SELECT $1 ~ ''^[0-9]+$''
' LANGUAGE 'sql';
...
Рейтинг: 0 / 0
isnumeric
    #37529683
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARTURV,

на заметку - пг !очень строго типизированный
...
Рейтинг: 0 / 0
isnumeric
    #37529795
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SmeL_md
Код: plaintext
1.
2.
CREATE FUNCTION isnumeric(text) RETURNS boolean AS '
SELECT $1 ~ ''^[0-9]+$''
' LANGUAGE 'sql';

Код: plaintext
1.
2.
SELECT '1E10' ~ '^[0-9]+$';
--
f

-думаю, можно написать ф-ю на основе обработки исключений каста. т.е. считать что всё, на что (на текущий момент в текущей бд) авто-преобразование типа текст в numeric не даёт ошибки - то и есть [с т.з. этой бд] - numeric.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
PREPARE foo(text) AS 
(SELECT $ 1 ::numeric);

EXECUTE foo('1.123E-10');
--
 0 . 0000000001123 
EXECUTE foo('s1.123E10');
--
ERROR:  invalid input syntax for type numeric: "s1.123E10"

********** Ошибка **********

ERROR: invalid input syntax for type numeric: "s1.123E10"
SQL state: 22P02
...
Рейтинг: 0 / 0
isnumeric
    #37530218
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq-думаю, можно написать ф-ю на основе обработки исключений каста. т.е. считать что всё, на что (на текущий момент в текущей бд) авто-преобразование типа текст в numeric не даёт ошибки - то и есть [с т.з. этой бд] - numeric.Только вот цена ловли ошибки в plpgsql функции очень большая.
...
Рейтинг: 0 / 0
isnumeric
    #37530331
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ребята, ну какого, простите, в базу за место цифры текст вставлять, а?
...
Рейтинг: 0 / 0
isnumeric
    #37530333
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
описывается "интерфейс", например можно хранимку. она типизированная, текст за место нумирика не примет и всё.

если дело в "хитрой" логике уже внутри. то тогда, регулярка на "цифры", да
...
Рейтинг: 0 / 0
isnumeric
    #37531022
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Warstoneqwwq-думаю, можно написать ф-ю на основе обработки исключений каста. т.е. считать что всё, на что (на текущий момент в текущей бд) авто-преобразование типа текст в numeric не даёт ошибки - то и есть [с т.з. этой бд] - numeric.Только вот цена ловли ошибки в plpgsql функции очень большая.
что есть, то есть

Код: 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.
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.
CREATE FUNCTION isnumeric_0(text) RETURNS boolean AS $$
SELECT $ 1  ~ '^[0-9]+$'
$$
 immutable LANGUAGE 'sql';
--
CREATE FUNCTION isnumeric_1(IN _input anyelement) RETURNS boolean AS $$
BEGIN 
	PERFORM _input::numeric;
	RETURN TRUE;
EXCEPTION
	WHEN OTHERS THEN
	RETURN FALSE;
END;
$$
 immutable LANGUAGE 'plpgsql';
--
CREATE TABLE test_t
(
  id serial,  
  textv text,
  numv numeric,
  CONSTRAINT test_t_pk primary key (id)
)
WITH (
  OIDS=FALSE
);
insert INTO  test_t(textv,numv) 
SELECT  CASE WHEN (random()>= 0 . 5 ) THEN 'v' ELSE '' END ||  s::text 
, s::numeric FROM generate_series( 1 , 10000 ) s
--
EXPLAIN ANALYZE
SELECT 
textv
,numv
FROM test_t
--
"Seq Scan on test_t  (cost=0.00..159.00 rows=10000 width=12) (actual time=0.020..11.764 rows=10000 loops=1)"
"Total runtime: 20.993 ms"
--
EXPLAIN ANALYZE
SELECT 
CASE WHEN isnumeric_0(textv) THEN textv::numeric ELSE NULL END AS numeric_
,textv
,CASE WHEN isnumeric_0(numv::text) THEN numv::numeric ELSE NULL END AS numv_
--ERROR:  function isnumeric_0(numeric) does not exist
,numv
FROM test_t
--
"Seq Scan on test_t  (cost=0.00..309.00 rows=10000 width=12) (actual time=0.041..35.616 rows=10000 loops=1)"
"Total runtime: 43.280 ms"
--не совсем бесплатно 
--
EXPLAIN ANALYZE
SELECT 
CASE WHEN isnumeric_1(textv) THEN textv::numeric ELSE NULL END AS numeric_
,textv
,CASE WHEN isnumeric_1(numv) THEN numv::numeric ELSE NULL END AS numv_
,numv
FROM test_t
--
"Seq Scan on test_t  (cost=0.00..5209.00 rows=10000 width=12) (actual time=0.275..381.080 rows=10000 loops=1)"
"Total runtime: 388.215 ms"
-- порядок
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
isnumeric
    #39928160
Шамиль Фаридович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,
Так какой способ лучше?
Почему в комментариях вы пишите "Порядок" напротив isnumeric_1, хотя она работает мделеннее?
...
Рейтинг: 0 / 0
isnumeric
    #39928260
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шамиль Фаридович
qwwq,
Так какой способ лучше?
Почему в комментариях вы пишите "Порядок" напротив isnumeric_1, хотя она работает мделеннее?
ну не два же порядка . и не три.

хотя если вы о двоичных порядках...
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / isnumeric
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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