简体   繁体   English

mysql选择case多列为

[英]mysql select case multiple columns as

I want to set multiple fields with something like this, how can I make it work? 我想用这样的东西设置多个字段,我怎样才能使它工作?

Select TableId,
    CASE
        WHEN StartTime > Appt THEN
            Field AS Field_1
            FieldId AS FieldId_1
        WHEN StartTime BETWEEN Appt AND DATE_ADD(Appt, INTERVAL 1 MONTH) THEN
            Field AS Field_2
            FieldId AS FieldId_2
    END
FROM TableA;

It doesn't work, the syntax is wrong near AS Field_1. 它不起作用,AS Field_1附近的语法错误。

You're trying to perform something similar to macro expansion in a SQL statement, which you cannot do. 您正尝试在SQL语句中执行类似于宏扩展的操作,这是您无法执行的操作。 The simplest way to solve your problem is to write the SQL dynamically in your application code, and execute that statement conditionally from the app. 解决问题的最简单方法是在应用程序代码中动态编写SQL,并从应用程序中有条件地执行该语句。

If you must do it within SQL, you have a couple of options. 如果必须在SQL中执行此操作,则有几个选项。

Each CASE is a single expression, so you can only produce output fields singly, by having a separate CASE for each column: 每个CASE都是一个表达式,因此您只能通过为每列单独的CASE单独生成输出字段:

SELECT ID,
  CASE WHEN StartTime > Appt THEN Field_A 
       WHEN StartTime BETWEEN Appt AND DATE_ADD(Appt, INTERVAL 1 MONTH) THEN
        Field_B
  END AS field1,
  CASE WHEN StartTime > Appt THEN Field_C 
       WHEN StartTime BETWEEN Appt AND DATE_ADD(Appt, INTERVAL 1 MONTH) THEN
        Field_D
  END AS field2
FROM TableA;

Alternatively, use the statement form of CASE (or IF , which might be simpler) within a stored procedure, to contain multiple versions of your statement and execute them conditionally. 或者,在存储过程中使用CASE (或IF ,可能更简单)的语句形式 ,以包含语句的多个版本并有条件地执行它们。

That is utterly broken case syntax. 这完全打破了case语法。 If all you're doing is changing the aliases of those fields, then do that transformation in your client. 如果您正在做的只是更改这些字段的别名,那么在您的客户端中进行该转换。

eg 例如

SELECT (StartTime > Appt) AS case1,
       (StartTime BETWEEN Appt AND Appt + INTERVAL 1 MONTH) AS case2
       Field,
       FieldID
FROM TableA

if ($row['case1']) then
    $field_1 = $row['Field'];
    $fieldid_1 = $row['FieldID'];
} else if ($row['case2']) {
    etc..
}

You are close, it looks like this 你很亲密,看起来像这样

Select TableId,
    CASE WHEN StartTime > Appt THEN Field   ELSE NULL END AS Field_1,
    CASE WHEN StartTime > Appt THEN FieldId ELSE NULL END AS FieldId_1,
    CASE WHEN StartTime BETWEEN Appt AND DATE_ADD(Appt, INTERVAL 1 MONTH) THEN Field ELSE NULL END AS Field_2 ,
    CASE WHEN StartTime BETWEEN Appt AND DATE_ADD(Appt, INTERVAL 1 MONTH) THEN FieldId ELSE NULL END AS FieldId_2

FROM TableA;

I dont know what is field_XXXX content, 我不知道field_XXXX内容是什么,

But i can make it work with reusing the switch case from the query like this one : (here i am using temporary variable ) 但我可以使用重新使用查询中的开关案例,如下所示:(这里我使用的是temporary variable

SELECT TableId,
    CASE
        WHEN StartTime > Appt THEN
            @temp := 'Field_1' 
        WHEN StartTime BETWEEN Appt AND DATE_ADD(Appt, INTERVAL 1 MONTH) THEN
            @temp := 'Field_2' 
    END AS `Field`,
    CASE
        WHEN @temp := 'Field_1' THEN 'FieldId_1'
        WHEN @temp := 'Field_2' THEN 'FieldId_2'
    END AS `FieldId`
FROM TableA; 

maybe this what you mean. 也许这就是你的意思。

change the order of your field selection, because case should be first column to be retrieved with alias in mysql the code should be as follows 更改字段选择的顺序,因为case应该是第一列用mysql中的别名检索,代码应如下所示

Select 
    CASE
        WHEN StartTime > Appt THEN
            Field AS Field_1
            FieldId AS FieldId_1
        WHEN StartTime BETWEEN Appt AND DATE_ADD(Appt, INTERVAL 1 MONTH) THEN
            Field AS Field_2
            FieldId AS FieldId_2
    END as <alias>,
TableId
FROM TableA;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM