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;