Crated 循环遍历列 Array 并查看值是否介于 X 和 Y 之间
Cratedb loop over column Array and see if the values fall between X and Y
嗨,堆栈溢出,所以我有一个名为 itemPrices 的列,它是一个整数数组;
[43, 44, 55]
所以我有一个 api 给我两个数字,X 和 Y。我想把这两个数字与数组进行比较。如果对象中的数字落在 X 和 Y 之间,我想检索内容。我将如何在 crateDB 中做这样的事情?
这可以用 User-Defined Function 来解决。
如果要查找数组中的元素,可以使用如下函数:
CREATE OR REPLACE FUNCTION array_filter(ARRAY(INTEGER), INTEGER, INTEGER) RETURNS ARRAY(INTEGER)
LANGUAGE JAVASCRIPT
AS 'function array_filter(array_integer, min_value, max_value) {
return Array.prototype.filter.call(array_integer, element => element >= min_value && element <= max_value);
}';
SELECT array_filter([5, 7, 20], 2, 8)
-- returns [5, 7]
如果只想判断给定边界内是否有值,也可以这样做:
CREATE OR REPLACE FUNCTION array_find(ARRAY(INTEGER), INTEGER, INTEGER) RETURNS BOOLEAN
LANGUAGE JAVASCRIPT
AS 'function array_find(array_integer, min_value, max_value) {
return Array.prototype.find.call(array_integer, element => element >= min_value && element <= max_value) !== undefined;
}';
SELECT array_find([5, 7, 20], 5, 300);
-- returns true
SELECT array_find([5, 7, 20], 25, 300);
-- returns false
这也可以通过使用 array_min(array) and array_max(array) 标量函数来解决:
cr> CREATE TABLE t1 (arr ARRAY(INTEGER));
CREATE OK, 1 row affected (1.918 sec)
cr> INSERT INTO t1 (arr) VALUES ([43, 44, 45]), ([42, 22, 105]);
INSERT OK, 2 rows affected (0.112 sec)
cr> SELECT arr FROM t1 WHERE array_min(arr) >= 43 AND array_max(arr) <= 45;
+--------------+
| arr |
+--------------+
| [43, 44, 45] |
+--------------+
SELECT 1 row in set (0.008 sec)
CREATE OR REPLACE FUNCTION filter_item_price(ARRAY(REAL), INTEGER, INTEGER) RETURNS BOOLEAN
LANGUAGE JAVASCRIPT
AS 'function filter_item_price(array_integer, min_value, max_value) {
if(array_integer === null || array_integer === undefined) {
return false;
}
return array_integer.some(element => element >= min_value && element <= max_value);
}';
SELECT "itemPrices"
FROM scp_service_transaction.transactions_v2
WHERE "tenantId" = 'aptos-denim'
AND "retailLocationId" IN (161)
AND array_find("itemPrices", 98, 100) limit 100;
嗨,堆栈溢出,所以我有一个名为 itemPrices 的列,它是一个整数数组;
[43, 44, 55]
所以我有一个 api 给我两个数字,X 和 Y。我想把这两个数字与数组进行比较。如果对象中的数字落在 X 和 Y 之间,我想检索内容。我将如何在 crateDB 中做这样的事情?
这可以用 User-Defined Function 来解决。
如果要查找数组中的元素,可以使用如下函数:
CREATE OR REPLACE FUNCTION array_filter(ARRAY(INTEGER), INTEGER, INTEGER) RETURNS ARRAY(INTEGER)
LANGUAGE JAVASCRIPT
AS 'function array_filter(array_integer, min_value, max_value) {
return Array.prototype.filter.call(array_integer, element => element >= min_value && element <= max_value);
}';
SELECT array_filter([5, 7, 20], 2, 8)
-- returns [5, 7]
如果只想判断给定边界内是否有值,也可以这样做:
CREATE OR REPLACE FUNCTION array_find(ARRAY(INTEGER), INTEGER, INTEGER) RETURNS BOOLEAN
LANGUAGE JAVASCRIPT
AS 'function array_find(array_integer, min_value, max_value) {
return Array.prototype.find.call(array_integer, element => element >= min_value && element <= max_value) !== undefined;
}';
SELECT array_find([5, 7, 20], 5, 300);
-- returns true
SELECT array_find([5, 7, 20], 25, 300);
-- returns false
这也可以通过使用 array_min(array) and array_max(array) 标量函数来解决:
cr> CREATE TABLE t1 (arr ARRAY(INTEGER));
CREATE OK, 1 row affected (1.918 sec)
cr> INSERT INTO t1 (arr) VALUES ([43, 44, 45]), ([42, 22, 105]);
INSERT OK, 2 rows affected (0.112 sec)
cr> SELECT arr FROM t1 WHERE array_min(arr) >= 43 AND array_max(arr) <= 45;
+--------------+
| arr |
+--------------+
| [43, 44, 45] |
+--------------+
SELECT 1 row in set (0.008 sec)
CREATE OR REPLACE FUNCTION filter_item_price(ARRAY(REAL), INTEGER, INTEGER) RETURNS BOOLEAN
LANGUAGE JAVASCRIPT
AS 'function filter_item_price(array_integer, min_value, max_value) {
if(array_integer === null || array_integer === undefined) {
return false;
}
return array_integer.some(element => element >= min_value && element <= max_value);
}';
SELECT "itemPrices"
FROM scp_service_transaction.transactions_v2
WHERE "tenantId" = 'aptos-denim'
AND "retailLocationId" IN (161)
AND array_find("itemPrices", 98, 100) limit 100;