在我们的数据库中,我们有表,其中有6-8M条记录,这些数据是静态的,为了性能优化,我们决定将此表中的一些数据存储在单独的表中,并且对于预定义的筛选器,使用此表中的值.例如,我们希望在该表中存储不同的州、城市和标签.

数据的例子可以表示在这样的测试表中:

CREATE TABLE test_data_table (
                                 id    BIGSERIAL PRIMARY KEY,
                                 state  text,
                                 city text
);

INSERT INTO test_data_table (state, city)
    values  ('MD', 'Union Bridge'),
            ('IL', 'Bourbonnais'),
            ('NC', 'Rdelk'),
            ('FL', 'Bonita Springs'),
            ('FL', 'Unit Ave Maria'),
            ('AZ', 'N Placita Chula Vista Tucson'),
            ('TX', 'Sienna'),
            ('LA', 'Lornager'),
            ('CA', 'Empire'),
            ('MA', 'Middleton'),
            ('CO', 'Yampa'),
            ('GA', 'Spr Project Name Unit'),
            ('IN', 'Greencastle'),
            ('NV', 'Flora'),
            ('RI', 'Coventry'),
            ('WA', 'Rice'),
            ('FL', 'Orange City'),
            ('TX', 'Haltom City'),
            ('CA', 'Moraga'),
            ('LA', 'Belle Chasse'),
            ('AZ', 'E Rincon Creek Ranch Rd Tucson'),
            ('CA', 'Acampo'),
            ('AZ', 'S Avra Rd Tucson'),
            ('GA', 'Folkston'),
            ('FL', 'Biscayne Park'),
            ('FL', 'All Units Oxford'),
            ('IL', 'Volo'),
            ('MN', 'Peterson'),
            ('LA', 'Rayville'),
            ('KY', 'South Park View'),
            ('AZ', 'E Camino Emmanuel Sahuarita'),
            ('CA', 'Wrighwood'),
            ('CA', 'Los Angeles'),
            ('AZ', 'N Teal Blue Tr Tucson'),
            ('NY', 'Clifton Park'),
            ('IN', 'Frankl'),
            ('KY', 'Anchorage'),
            ('LA', 'Crown Point'),
            ('CA', 'Los BanosStruct CalcsSpan T'),
            ('IL', 'Chebanse');

下面是筛选器的分隔表的示例以及使用值填充该表的方法:

    CREATE TABLE test_filter_values
(
    id    BIGSERIAL PRIMARY KEY,
    type  text,
    value jsonb
);

INSERT INTO test_filter_values (type, value)
VALUES ('CITY', (SELECT json_agg(DISTINCT city)::jsonb FROM test_data_table));

INSERT INTO test_filter_values (type, value)
VALUES ('STATE', (SELECT json_agg(DISTINCT state)::jsonb FROM test_data_table));

因此,当我们try 从该表中查询数据时,会发生the main issue,以下是示例:

SELECT DISTINCT city from test_data_table
WHERE city ILIKE 'b%';

该查询返回4个结果; 还有这一张:

SELECT city FROM (SELECT jsonb_array_elements(value) AS city
                  FROM test_filter_values WHERE type = 'CITY') cities
WHERE city::text ILIKE 'b%';

不返回任何结果, LIKE运算符在开始或结束时不带%,从TEST_FILTER_VALUES表中返回零结果,但如果在这种情况下使用LIKE '%b%',行为是相同的.完全匹配时也会出现同样的问题:

SELECT state FROM (SELECT jsonb_array_elements(value) AS state
                   FROM test_filter_values WHERE type = 'STATE') states
WHERE state::text = 'NC';

它也不返回任何结果.

那么在这种情况下我们该如何处理呢?

推荐答案

这是因为jsonb_array_elements返回的是jsonb而不是文本.JSON数组中可能有其他数组、对象、对象数组等.

这意味着文本值将被引用为JSON,当它被转换为文本时,您将try 匹配"Anchorage"而不是Anchorage.

如果您想要使用文本数组,可以只存储文本数组?

Sql相关问答推荐

如何将varchar传递给tvf并使用该参数来查询结果SQL服务器

如何在T—SQL中找到值更改之前的日期?

获取每个帖子的匹配关键字列表

GROUP BY和GROUP_CONCAT用于计算比赛排名

Postgres trunc_date删除一个月

Android房间fts4匹配语法AND OR

SQL -滞后于上一个非重复值

从日期开始向前填充重复项

Oracle SQL根据列中的条件 Select 最大记录数

如何在postgres函数中插入后返回布尔值?

连接三个表的正确方式是什么?在这三个表中,可以显示在一个表上的行将在其他表中显示结果

如何在presto中映射id与名称

属于(日期)范围类型及其交集的总权重​

使用左外部联接更正列中第+1行的值时重复

Athena 计算从日期到当前时间戳的每月计数

在同一列上迭代时计算持续时间

什么是 100.它与 100 有什么区别?

查询以查找今天和昨天的数据之间的差异以及伪列

在多个表上递归查找

在sql server中创建唯一标识符列