【问题标题】:python sqlite string comparisonpython sqlite字符串比较
【发布时间】:2022-01-10 16:39:17
【问题描述】:

我有一个表中包含多行的 sqlite 数据库。其中一个列包含具有任意数量的正整数的字符串,因此:

1: '### ## # # # ## # ##'
2: '# ## # ## # ##'
3: '# # # ## ## ### #'
...

我还在我的 python 代码中得到了一个比较字符串,它看起来也像 '## # ### #' 比较字符串还包含任意数量的正整数。

现在,如果我们将数据库字符串设为“a b c d e f”,将比较字符串设为“g h i j k” 例如,我需要测试我的比较字符串中的任何 3 个连续数字(所以“g h i”或“h i j”或“i j k”)是否也是数据库中的连续数字。所以基本上我需要测试数据库中的每一行是否

'g h i' == 'a b c' or 'g h i' == 'b c d' or ...

我的数据当前保存在数据库中的方式是否可行,或者我需要以任何其他方式保存我的数据。无论哪种方式,我如何使用 SQL 做到这一点?

【问题讨论】:

    标签: python sql sqlite window-functions sliding-window


    【解决方案1】:

    我会为您的桌子提出不同的设计。

    而不是像这样存储数字:

    grp value
    1 '10 100 20 5 70'
    2 '100 20 5 35 3 15'

    您可以对表格进行规范化,使每一行仅包含 1 个值:

    id grp value
    1 1 10
    2 1 100
    3 1 20
    4 1 5
    5 1 70
    6 2 100
    7 2 20
    8 2 5
    9 2 35
    10 2 3
    11 2 15

    这样更容易连接连续的数字(以三元组或其他形式),以便您可以检查连接的数字是否包含在您的字符串中。

    创建表:

    CREATE TABLE tablename(id INTEGER PRIMARY KEY AUTOINCREMENT, grp INTEGER, value INTEGER);
    

    并且对于每一行使用窗口函数LEAD() 来获取下一个数字和之后的数字,以便创建一个串联的三元组。
    然后您可以使用运算符LIKE 来检查您的字符串中是否存在三元组:

    WITH cte AS (
      SELECT *, 
              value || ' ' ||
              LEAD(value, 1) OVER (PARTITION BY grp ORDER BY id) || ' ' || 
              LEAD(value, 2) OVER (PARTITION BY grp ORDER BY id) str
      FROM tablename
    )
    SELECT grp, MAX(' ' || ? || ' ' LIKE '% ' || str || ' %') flag
    FROM cte 
    GROUP BY grp;
    

    或者,更好的可扩展解决方案:

    WITH cte AS (
      SELECT *, 
             CASE WHEN ROW_NUMBER() OVER (PARTITION BY grp ORDER BY id) > 2
               THEN GROUP_CONCAT(value, ' ') OVER (
                        PARTITION BY grp ORDER BY id 
                        ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
                    )
             END str
      FROM tablename
    )
    SELECT grp, MAX(' ' || '6 100 20 5 12 19' || ' ' LIKE '% ' || str || ' %') flag
    FROM cte 
    GROUP BY grp;
    

    ? 替换为您的字符串。

    查看简化的demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2012-10-06
      • 2022-01-16
      • 2017-08-13
      • 2015-02-24
      • 2019-01-17
      • 2013-12-08
      相关资源
      最近更新 更多