【问题标题】:SQL - Use different Select Statements based on column valueSQL - 根据列值使用不同的选择语句
【发布时间】:2018-07-31 12:54:23
【问题描述】:

例如,

Select field1

From table1

when table1.field1 = 'S'

     then (select field1,2,3,4,5,6,.....
           form table1,2,3,4,5,6,....(with joins))

when table1.field1 = 'O'

     then (select field1,2,3,4,5,6,.....
           from table1,2,3,4,5,6,.....(with join))

【问题讨论】:

  • 分享样本数据和预期输出样本
  • 请同时添加您拥有的数据库提供商的标签(例如 Oracle、Postgres 等),这可能会启用有针对性的答案。
  • 使用 Microsoft Sql 服务器。 -- 基于“S”和“O”将确定使用哪些连接序列。输出数据将/应该是相同的。但是,由于我们使用的是商业软件,因此它对订单进行了不同的标记。 S - Scheduled Release 和 O - Order,我将从这两个子句中获得相同的信息,但如何加入以及将信息推送到何处的流程因字母而异。

标签: sql


【解决方案1】:

我想我得到了你需要的东西。一种可能的解决方案是创建一个带有硬编码 where 子句的视图。思路是这样的:

CREATE VIEW ConditionalSelect AS
SELECT ...fields...
FROM ...tables...
JOIN ...joins...
WHERE table1.field1 = 'S'
AND ....

UNION

SELECT ...fields...
FROM ...tables...
JOIN ...joins...
WHERE table1.field1 = 'O'
AND ....

那么你可以这样做:

SELECT * 
FROM ConditionalSelect
WHERE field1 = 'S'

注意SELECT 必须具有相同的列、列类型和列名,否则 VIEW 将无法编译。

【讨论】:

  • 我认为这已经接近我所需要的了。我开始的上述代码将在一个视图中创建,该视图将连接到基于生产订单号的内置 SQL 语句。
  • 如果您认为正确,请将任何答案标记为正确。
【解决方案2】:

你可以这样做:

DECLARE @Field1 VARCHAR(10) =
(
    SELECT Field1
    FROM table1
);

IF(@Field1 = 'S')
BEGIN
    SELECT *
    FROM table1 t1
        INNER JOIN table2 t2
            ON t2.col1 = t1.col1 
END
ELSE IF (@Field1 = 'O')
BEGIN
    SELECT *
    FROM table1 t1
        INNER JOIN table2 t2
            ON t2.col1 = t1.col1 
END

让您免于创建视图

【讨论】:

  • 在修改后,这确实返回了我正在寻找的内容,但我需要能够获得作为视图返回的相同数据,以便我可以将该视图加入预建我们的业务软件中的sql函数。是否可以将其保存为存储过程并从视图传递生产订单号并返回存储过程的值?
  • 是的,你可以这样做。请参阅以下问题作为如何从 SQL 中的 SP 返回数据的示例。 stackoverflow.com/questions/11965269/…
猜你喜欢
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2011-08-22
相关资源
最近更新 更多