Сравнение массивов float4[]

Generalproger
Дата: 07.04.2015 14:02:00
Здравствуйте, есть поле special формата float4[], в нем хранятся деньги пользователя.
При покупке товара на сайте делал проверку
WHERE special > '{0,1500,0,30}'
Но сегодня внезапно осознал что запрос
WHERE special >= '{0,3750,1500,0}' выводит строку при ее значении в {0.5,2500,2980.7,1} т.е. как будто 1500 > 2500
Как это исправить или возможно есть другие варианты для расчетом с массивами?

P.S. special >= '{0,3750,1500,0}' при значении special в {0.5,2500,2980.7,1} почему то работает как надо (т.е. не выводит ответа)
Generalproger
Дата: 07.04.2015 14:05:55
Опечатался в PS хотел написать:
P.S. special >= '{1,3750,1500,0}' при значении special в {0.5,2500,2980.7,1} почему то работает как надо (т.е. не выводит ответа)
Maxim Boguk
Дата: 07.04.2015 14:16:24
Generalproger
Опечатался в PS хотел написать:
P.S. special >= '{1,3750,1500,0}' при значении special в {0.5,2500,2980.7,1} почему то работает как надо (т.е. не выводит ответа)


так они у вас как текстовые строки сравниваются скорее всего...

--Maxim Boguk
www.postgresql-consulting.ru
qwwq
Дата: 07.04.2015 14:17:10
Generalproger,

вы неверно представляете сравнение массивов. они сравниваются как слова (ращной вообще-то длины), вместо букв -- элементы.

а вам видимо хочется поэлементного сравнения


SELECT
	ARRAY []::float4[] > array[0::float4,1500,0,30]
	,ARRAY[0.5::float4,2500,2980.7,1]>array[0::float4,1500,0,30]
	,ARRAY[0.5::float4]>array[0::float4,1500,0,30] -- тащемто -- вот что имеет вес

	-- полагаю вам нужно что-то из :
	,(SELECT bool_and(u>v) FROM (SELECT unnest(ARRAY[0.5::float4,2500,2980.7,1])u ,unnest (array[0::float4,1500,0,30]) v)foo )
Ы2
Дата: 08.04.2015 14:54:09
qwwq,

массивы сравниваются поэлементно, но надо учитывать Table 9-45. Array Operators.
Maxim Boguk
Дата: 08.04.2015 15:20:07
Generalproger
Здравствуйте, есть поле special формата float4[], в нем хранятся деньги пользователя.
При покупке товара на сайте делал проверку
WHERE special > '{0,1500,0,30}'
Но сегодня внезапно осознал что запрос
WHERE special >= '{0,3750,1500,0}' выводит строку при ее значении в {0.5,2500,2980.7,1} т.е. как будто 1500 > 2500
Как это исправить или возможно есть другие варианты для расчетом с массивами?

P.S. special >= '{0,3750,1500,0}' при значении special в {0.5,2500,2980.7,1} почему то работает как надо (т.е. не выводит ответа)



обьясните какое поведение вы хотите вообще? Я что то не вижу никаких проблем в том что вы привели.

--Maxim Boguk
www.postgresql-consulting.ru
qwwq
Дата: 08.04.2015 15:32:04
Ы2
qwwq,

массивы сравниваются поэлементно, но надо учитывать Table 9-45. Array Operators.

а слова - побуквенно
и чо ?

ключевое тут -- " с позиционным приоритетом"

если я и болван, что периодически наблюдаемо, то остальные тут вообще дятлы, очевидно

я-то, в слове "поэлементно" имел в виду не сравнение с позиционным приоритетом, а bool_and на массиве поёлементных сравнений. что и привёл в скрипте. мыслящему -- достаточно.