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;