字符串解析与数据库查询

2024-04-26 11:00:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个MySQL表,其中包含以下数据:

TempID    TempName       TempString 
1         aaa            34:56:23:45:67:55
2         bbb            12:56:67:45:33:99

我想执行一个计算,它需要将TempString拆分为其单独的值,例如34、56、23。在

最好的方法是:

  1. 在python中进行字符串解析并使用其值
  2. TempID存储值的单独表

    ^{pr2}$

    查询以获取每个TempID的值并进行计算

请提出最好的方法。在


Tags: 数据方法字符串mysqlbbbaaapr2tempid
3条回答

让我们先评估一下你的两个选择。在

选项1:

您应该以字符串形式检索temp id,并使用冒号作为分隔符split函数的语法是

str.split(str="", num=string.count(str)).

默认分隔符是空间。那个这种方法的问题是应该在python脚本中创建一个映射,该映射将每个tempid指向所有可能的值检索到了这种方法的优点是可以避免在数据库。虽然可以使用规范化表单并更好地组织数据。在

选项2:

这是一种实现需求的简单方法,即使不是最佳方式。在

选项3:

经常使用表达式。检查这个。在

^{pr2}$

您可以去掉括号并将字符串拆分为两个两位数,然后在查询。优势你不需要换桌子吗结构.约束很难有规律地写作表情。这个是实现目标的最佳方式。在

选项4:

在mysql中使用REGEXP查询问题是mysql正则表达式使用POSIX标准,要将我上面给出的正则表达式转换成这个标准,您应该做一些替换,比如//d到digit或[0-9]和*?到^和其他一些我不知道的羞耻,但这种类型的执行将提高您的查询性能,特别是当您使用索引时。在

你的第二个解决方案是最好的。规范化您的数据库,用一个额外的表来存储这些值。在

当值的数量发生变化时,多列会很困难(如果需要,也会阻止您轻松地使用聚合函数)。在

将所有值检索到一个脚本中是可能的,但是会再次阻止您使用数据库的功能(并且可能会迫使您返回远远超过所需的行,因为在执行可能定义是否需要返回它们的计算之前返回这些行)。在

数据库中的分隔列表很麻烦。但是,您可能可以将其拆分为使用以下查询插入新表中这:在

SELECT NULL, sometable.TempID, SUBSTRING_INDEX(SUBSTRING_INDEX(sometable.TempString, ':', aCnt), ':'. -1)
FROM sometable
CROSS JOIN
(
    SELECT 1+ units.i + tens.i * 10 AS aCnt
    FROM
    (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units,
    (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
) sub0
WHERE aCnt <= (LENGTH(sometable.TempString) - LENGTH(REPLACE(sometable.TempString,':', '' )))

这将处理多达100个值,但易于扩展。在

好吧,最大的问题是,打破这些值在语义上是正确的吗?在

在设计数据库表时,需要考虑每个列的域定义。存储在一列中的每个数据项都应该是原子的(不可分解的)。这意味着存储在列中的项是为特定列定义的域元素。这可以称为域完整性约束(有关更多信息,请查看维基百科上的文章data integrity)。在

您可以使用一个简单的启发式方法来帮助您做出最后的决定:您是否需要或将需要使用存储字符串的一部分进行搜索,即在where子句中。如果是,请将字符串拆分为单独的表列,否则只需使用Python解析它。在

破坏域完整性的一个简单示例是使用一个表来存储blog posts,其中单个post的所有标记都被连接到一个大字符串中,并且只存储在一行中,而不是使用一个单独的表来连接posts和tags。在

将相对复杂的值存储到一列中的一个明显的例子是存储日期。即使它是由多个值组成的,如果没有关于年、月、日的所有信息,完整日期也不是完整的(原子的)。。。在

相关问题 更多 >