select case when t = '1' then 896257460988416000 when t = '2' then 896257431468904448 end as supplytype from regexp_split_to_table( (select(replace(replace(replace(suppliers,'[',''),']',''),'"','')) from kpi_library where id = kl.id),',') as t 报错t不属于字段,应如何修改
时间: 2023-08-06 08:19:29 浏览: 106
根据你的 SQL 语句,因为 `t` 是在 `select` 语句中定义的一个列别名,所以在 `regexp_split_to_table` 函数中无法直接使用 `t`。你可以使用子查询来解决这个问题,具体的 SQL 语句如下:
```
SELECT
CASE
WHEN t = '1' THEN 896257460988416000
WHEN t = '2' THEN 896257431468904448
END AS supplytype
FROM
(SELECT
regexp_split_to_table(
replace(replace(replace(suppliers, '[', ''), ']', ''), '"', ''),
','
) AS t
FROM
kpi_library
WHERE
id = kl.id
) AS subquery;
```
在这个语句中,我们使用了一个子查询来将 `regexp_split_to_table` 的输出作为一个临时表,并将其命名为 `subquery`。在这个临时表中,我们可以使用 `t` 作为一个列名,然后在外部查询中使用这个列来进行条件判断。
相关问题
void PolicySinkSelectCapability(Port_t *port) { /* AW_LOG("enter PolicySubIndex = %d\n", port->PolicySubIndex); */ switch (port->PolicySubIndex) { case 0: if (PolicySendData(port, DMTRequest, &port->SinkRequest, sizeof(doDataObject_t), peSinkSelectCapability, 1, SOP_TYPE_SOP, AW_FALSE) == STAT_SUCCESS) { TimerStart(&port->PolicyStateTimer, tSenderResponse); port->WaitingOnHR = AW_TRUE; } break; case 1: if (port->ProtocolMsgRx) { port->ProtocolMsgRx = AW_FALSE; if (port->PolicyRxHeader.NumDataObjects == 0) { switch (port->PolicyRxHeader.MessageType) { case CMTAccept: /* Check if PPS was selected (Here as well, for GUI req) */ port->PpsEnabled = (port->SrcCapsReceived[port->SinkRequest.FVRDO.ObjectPosition - 1].PDO.SupplyType == pdoTypeAugmented) ? AW_TRUE : AW_FALSE; port->PolicyHasContract = AW_TRUE; port->USBPDContract.object = port->SinkRequest.object; TimerStart(&port->PolicyStateTimer, tPSTransition); SetPEState(port, peSinkTransitionSink); if (port->PpsEnabled == AW_TRUE) TimerStart(&port->PpsTimer, tPPSRequest); break; case CMTWait: case CMTReject: if (port->PolicyHasContract) SetPEState(port, peSinkReady); else { SetPEState(port, peSinkWaitCaps); /* Make sure we don't send reset to prevent loop */ port->HardResetCounter = nHardResetCount + 1; } break; case CMTSoftReset: SetPEState(port, peSinkSoftReset); break; default: SetPEState(port, peSinkSendSoftReset); break; } } else { switch (port->PolicyRxHeader.MessageType) { case DMTSourceCapabilities: UpdateCapabilitiesRx(port, AW_TRUE); SetPEState(port, peSinkEvaluateCaps); break; default: SetPEState(port, peSinkSendSoftReset); break; } } } else if (TimerExpired(&port->PolicyStateTimer)) { SetPEState(port, peSinkSendHardReset); } else { port->PEIdle = AW_TRUE; } break; } }代码分析
这是一个函数,函数名称为PolicySinkSelectCapability,其参数为指向Port_t类型的指针port。
该函数的作用是选择Sink的能力并发送请求。
函数采用switch语句根据port->PolicySubIndex的值来进行不同的操作。当PolicySubIndex为0时,函数会调用PolicySendData函数发送一个DMTRequest类型的请求,并启动定时器TimerStart。当PolicySubIndex为1时,函数会判断port->ProtocolMsgRx的值,如果为真,则进行一系列的判断,根据接收到的消息类型进行不同的操作;如果为假,则判断定时器TimerExpired的值,如果为真,则调用SetPEState函数设置电源协商状态,并进行相应的操作;否则,将port->PEIdle的值设置为真。
在具体的操作中,当接收到的消息类型为CMTAccept时,会设置port->PpsEnabled的值,并启动定时器TimerStart;当接收到的消息类型为CMTWait或CMTReject时,如果已经有合同,则设置电源协商状态为peSinkReady;否则,设置电源协商状态为peSinkWaitCaps,并将port->HardResetCounter的值设置为nHardResetCount + 1;当接收到的消息类型为CMTSoftReset时,设置电源协商状态为peSinkSoftReset;否则,设置电源协商状态为peSinkSendSoftReset。
当接收到的消息类型为DMTSourceCapabilities时,调用UpdateCapabilitiesRx函数更新接收到的能力,并设置电源协商状态为peSinkEvaluateCaps;否则,设置电源协商状态为peSinkSendSoftReset。
/* Going to select the highest power object that we are compatible with */ for (i = 0; i < port->SrcCapsHeaderReceived.NumDataObjects; i++) { switch (port->SrcCapsReceived[i].PDO.SupplyType) { case pdoTypeFixed: /* pdoTypeFixed */ objVoltage = port->SrcCapsReceived[i].FPDOSupply.Voltage * 50; if (objVoltage > port->PortConfig.SinkRequestMaxVoltage) { /* If the voltage is greater than our limit... */ continue; } else { /* Calculate the power for comparison */ objCurrent = port->SrcCapsReceived[i].FPDOSupply.MaxCurrent * 10; objPower = (objVoltage * objCurrent) / 1000; } break; case pdoTypeVariable: case pdoTypeBattery: case pdoTypeAugmented: PPSAPDO = i + 1; objVoltage = port->SrcCapsReceived[i].PPSAPDO.MaxVoltage * 100; if (objVoltage > port->PortConfig.SinkRequestMaxVoltage) { /* If the voltage is greater than our limit... */ continue; } else { /* Calculate the power for comparison */ objCurrent = port->SrcCapsReceived[i].PPSAPDO.MaxCurrent * 50; objPower = (objVoltage * objCurrent) / 1000; } break; default: /* Ignore other supply types for now */ objPower = 0; break; } /* Look for highest power */ if (objPower >= MaxPower) { MaxPower = objPower; SelVoltage = objVoltage; reqPos = i + 1; } }代码分析
这段代码是一个 USB PD(Power Delivery)协议的实现,用于在连接的设备之间确定电源供应类型和电源参数,以便为设备提供所需的电能。这段代码的作用是在所有可供选择的电源中,选择与当前设备兼容并输出最高功率的电源。
具体来说,代码通过遍历接收到的源电源容量数据对象,分别计算每个电源的电压和电流,从而计算出该电源可以提供的最大功率。对于不同类型的电源,代码使用不同的方法计算电流和电压。
代码中使用变量 MaxPower 和 SelVoltage 记录当前选择的最大功率和电压,并且使用 reqPos 记录所选电源的位置。最后,代码返回选择的电源位置和所需电压,以便设备可以向所选择的电源发出请求。
阅读全文