mysql选择case多列作为

mysql选择case多列作为,mysql,Mysql,我想用这样的东西设置多个字段,如何才能使其工作 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 Fi

我想用这样的东西设置多个字段,如何才能使其工作

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;

它不起作用,字段1附近的语法是错误的。

这是完全错误的
大小写
语法。如果您所做的只是更改这些字段的别名,那么在您的客户机中进行转换

e、 g


您正试图在SQL语句中执行类似于宏扩展的操作,但这是无法执行的。解决问题的最简单方法是在应用程序代码中动态编写SQL,并从应用程序有条件地执行该语句

如果必须在SQL中执行此操作,则有几个选项

每个
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;

或者,在存储过程中使用(或,可能更简单)来包含语句的多个版本,并有条件地执行它们。

如果您很接近,它看起来是这样的

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;

我不知道什么是
字段\u XXXX
内容

但我可以通过重用查询中的switch case来实现,如下所示: (这里我使用的是
临时变量


也许这就是你的意思。

更改字段选择的顺序, 因为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;
选择
案例
当开始时间>应用时
字段作为字段_1
FieldId作为FieldId_1
当开始时间介于Appt和DATE_ADD之间时(Appt,间隔1个月),则
字段作为字段2
FieldId作为FieldId_2
以,
表格
来自表A;

您没有说您所做的有什么不好,您的
SET
语句在哪里?您的意图是让您的case语句生成两个额外字段还是四个额外字段?您有四个不同的名称正在生成。想要两个字段,只是不想计算每个字段的条件,而是希望执行一次条件,然后将其应用于多个字段。您能详细解释一下您想要完成的任务吗?看起来您想根据所选数据更改列别名。这是不可能的,因为在
CASE
语句中并非所有行都满足相同的条件。查询结果必须对所有行的每一列只有一个列别名。这是内部查询的一部分,我不能这样做。但它对每个字段运行一次该条件,我希望它运行一次并将其应用于多个字段。您建议的方法基本上就是我目前正在做的。@Raymond-那么答案是否定的,在SQL中不能这样做
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; 
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;