【问题标题】:Select row based on dynmically created value根据动态创建的值选择行
【发布时间】:2020-10-28 17:04:24
【问题描述】:

我下面有一个sql表,列参数的值和参数值是动态创建的。下面的设计是为了满足后期添加的附加参数。所以我认为使用参数和参数值作为列并不适合这种设计。

|---------------------|------------------|------------------|
|      Parameter      | Parameter Value  |     Computers    |
|---------------------|------------------|------------------|
|          Phase      |         New      |         PC1      |
|---------------------|------------------|------------------|
|          Phase      |         New      |         PC2      |
|---------------------|------------------|------------------|
|          Phase      |   Redevelopment  |         PC3      |
|---------------------|------------------|------------------|
|          Cost       |         High     |         PC1      |
|---------------------|------------------|------------------|
|          Cost       |         High     |         PC2      |
|---------------------|------------------|------------------|
|          Cost       |         Cost     |         PC3      |
|---------------------|------------------|------------------|

假设用户按 Phase = "New" AND Cost = "High" 进行搜索,结果将是 PC1。

此刻,我能想到的是这样的:

SELECT * 
FROM projectParameter 
WHERE Parameter = 'Phase' AND Value = 'New' AND Parameter = 'Cost' AND Value = 'High'

提前致谢!

【问题讨论】:

  • 你的意思是where Parameter = 'Cost' and Parameter Value = 'High'
  • @SomeBody - 不,因为该条件一次仅适用于一行,但 OP 询问如何将条件应用于一组行 (返回所有包含P='Cost' AND 'PV='High' 行并包含 P='Phase' AND PV='New'row。)

标签: c# sql sqlite


【解决方案1】:

首先,选择与过滤的任何部分匹配的所有行。

然后聚合所有这些行以获得每台计算机的一个结果。

然后检查每个结果,看它是否包含所有需要的过滤约束。

SELECT
  Computers
FROM
  yourTable
WHERE
  (Parameter = 'Phase' AND ParameterValue = 'New')
  OR
  (Parameter = 'Cost'  AND ParameterValue = 'High')
GROUP BY
  Computers
HAVING
  COUNT(*) = 2

【讨论】:

  • 如果同一台计算机有两个参数 = 'cost' 和 parametervalue='high' 的条目,反之亦然,'phase' 的情况下,这将无法正常工作。但是,对于每台计算机的成本/阶段的唯一条目,这将正常工作。
  • @Jasmeet - 解决方案是清除重复数据;从表中删除,或引入嵌套查询以在查询数据之前对数据进行重复数据删除。同样,如果表中有重复项,您的查询将多次返回该计算机,并且解决方案将是相同的。
  • 嗨,我希望包含两个标准(和)谢谢。
【解决方案2】:

据我了解,您似乎想要列出以下两种情况都有计算机条目的所有计算机:

  • 参数 = '成本' AND 参数值 = '高'
  • 参数 = '阶段' AND 参数值 = '新'

您可以尝试下面的 sql 查询来查看您需要的结果:

SELECT t.computer
FROM table t
WHERE t.parameter = 'cost'
    AND t.parameter_value = 'high'
    AND EXISTS (
        SELECT computer FROM table where computer=t.computer AND parameter = 'phase' AND parameter_value = 'new');

【讨论】:

  • 这个可以支持更多参数吗?由于动态创建的计算机类型、计算机所有者等?
  • @johny 是的,您可以将多个 EXISTS 子句附加到当前查询。这可以帮助您处理需要的多个参数/参数值对。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 2022-06-20
  • 2017-02-21
  • 1970-01-01
  • 2019-07-25
  • 2019-12-30
  • 1970-01-01
相关资源
最近更新 更多