【问题标题】:How to count elements of a column of a table having more than one values如何计算具有多个值的表格列的元素
【发布时间】:2018-03-30 16:54:36
【问题描述】:

我的问题是:我有一个表 Compose,其中包含一个列 emailID。在本专栏中,我有 abc@abc.comdef@abc.com, ghi@abc.com 之类的数据。

现在,每当我使用 select count(*) from compose 计算该列的元素数量时,它都会显示答案:2 个元素,但它应该返回 3 个元素的答案。它应该将def@abc.comghi@abbc.com 计为在一行中的两个元素。我的问题是如何在两个条目之间用逗号创建一个行条目。有任何 SQL 命令吗?

谢谢

【问题讨论】:

  • 修复您的数据结构,这样您就不会在单个列中存储多个值。
  • 我猜:SUM(# of commas + 1)。根据您的 dbms,您应该使用可用的字符串函数来计算逗号的数量

标签: sql count


【解决方案1】:

您不应该在单个列中存储多个值。这不是存储数据的 SQL 方式。相反,您需要另一个表格,每封电子邮件有一行。

也就是说,如果您无法更改数据模型,那么这种方法将适用于您提出的具体问题:

select sum(case when emails not like '%,%' then 1
                when emails not like '%,%,%' then 2
           end) as full_cnt

【讨论】:

  • 感谢您。但是我如何将数据存储在两个不同的行上。我正在使用一个文本框,用户必须在其中输入他的电子邮件地址。问题是它也可以发送给多个收件人。所以,如果他写 abc@abc.com,def@abc.com 那么我如何将这两封邮件分开并将其存储在两个不同的行中。
  • 这就是为什么我将收件人作为一个整体存储
【解决方案2】:

正如之前评论中所建议的 - 不要!将您需要处理的数据存储在单一的 - 难以理解的字段中。当真正存储一封电子邮件时,您还可以在保存之前对其进行验证。

  1. 创建一个绑定到主表的子表“emails”(通常使用外键)
  2. 当用户将数据输入文本框时 - 您的应用程序应该进行拆分并存储被吐到“电子邮件”表中的单个电子邮件

    string[] emls = textBox.Text.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries);
    
  3. 当呈现数据供用户编辑时,您可以将“电子邮件”中的数据组合到单个文本框中。

【讨论】:

  • 那么如何提取 emls 中存在的数据?
  • [pseudocode] foreach(var em in emls) -> 插入电子邮件(fieldName)值(em)
猜你喜欢
  • 2022-06-15
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 2020-03-16
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
相关资源
最近更新 更多