我的sp中有以下内容用于where语句:
connectionGroup = new GroupConnection();
connectionGroup.groupConnection(StateMachine.this, new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
//checking connectionGroup.responses == null doesnt work since the connectionRequest gives IOException if no network.So Toastbar doesnt work here.
if (connectionGroup.responses == null) {
ToastBar.showErrorMessage("Please check your network connection", 4000);
}
if (connectionGroup.responses != null) {
for (Map<String, Object> element : connectionGroup.responses) {
String tableName = (String) element.get("name");
TextArea nameLabel = new TextArea(tableName.toUpperCase());
f.add(singleRowContainerr);
}
}
}
}
我已经在linq做过:
SELECT h.HLDG_DATE,
m.PTF_FIDEM_ID,
m.PTF_Name,
id.IDENTIFIER_NAME,
MIN(h.DESCRIPTION) DESCRIPTION,
ii.SPEC_TABLE,
m.PTF_CURRENCY,
id.IDENTIFIER_VALUE,
h.CURRENCY,
h.HLDG_QTY,
MIN(h.CURRENT_PRICE) current_price,
h.INSTRUMENT_ID
FROM HOLDINGS_BREAKDOWN h
LEFT JOIN FI_SYS_PTFIDX_LIST m on (m.PTF_FIDEM_ID = h.PORTFOLIO_ID)
LEFT JOIN inst_identifiers id on (h.instrument_id = id.instrument_id)
LEFT JOIN INST_CASH ic ON h.INSTRUMENT_ID = ic.INSTRUMENT_ID
LEFT JOIN INST_FX_FORWARD iff ON h.INSTRUMENT_ID = iff.INSTRUMENT_ID
LEFT JOIN INST_FX_SPOT ifs ON h.INSTRUMENT_ID = ifs.INSTRUMENT_ID
JOIN INST_IDS ii ON h.INSTRUMENT_ID = ii.INSTRUMENT_ID
WHERE h.PORTFOLIO_ID = 112
AND h.HLDG_DATE >= '28 November 2014'
AND h.HLDG_DATE <= '31 December 2014'
AND id.IDENTIFIER_NAME = (CASE WHEN ii.SPEC_TABLE
in ('INST_BOND','INST_EQUITY','INST_FUTURE') THEN 'ISIN'
WHEN ii.SPEC_TABLE ='INST_CASH' THEN 'XXX'
WHEN ii.SPEC_TABLE = 'INST_INDEX_RETURN_SWAP'
THEN 'BBG_UNIQUE' WHEN ii.SPEC_TABLE = 'INST_TOTAL_RETURN_SWAP'
THEN 'BBG_UNIQUE' ELSE 'STATESTREET' END )
GROUP BY h.HOLDING_PARAMS_ID,h.INSTRUMENT_ID, h.CURRENCY,id.IDENTIFIER_VALUE,h.HLDG_QTY,
ii.SPEC_TABLE, h.HLDG_DATE,m.PTF_FIDEM_ID,m.PTF_Name,id.IDENTIFIER_NAME,m.PTF_CURRENCY
ORDER BY h.HLDG_DATE,Description DESC
我正在努力解决最后一个条件&#34;案例&#34;你可以帮助我吗?
答案 0 :(得分:1)
好吧,它可能不会生成相同的CASE语句,但功能等价物将是:
string[] isins = new [] {"I_BOND","I_EQUITY","I_FUTURE"}
...
where h.PORTFOLIO_ID == Convert.ToInt16(PfID)
&& h.HLDG_DATE >= Convert.ToDateTime(DTstart)
&& h.HLDG_DATE <= Convert.ToDateTime(DTend)
&& id.IDENTIFIER_NAME == (
inins.Contains(ii.SP_TABLE) ? "ISIN" :
ii.S_TABLE == "I_CASH" ? "CDB" :
ii.S_TABLE == "I_INDEX_RETURN_SWAP" ? "BBG_UNIQUE" :
ii.S_TABLE == "INST_TOTAL_RETURN_SWAP" ? "BBG_UNIQUE" :
"STTREET");
另一种选择是将该映射放在表中并改为JOIN
。
另请注意,您可能必须在Linq语句之外执行Convert.ToXXX
调用,并将结果存储为变量,以便它们被Linq视为常量。
答案 1 :(得分:0)
我建议只使用三元运算符?:
来构建语句。这不是最美丽的方式,但在这种情况下完全没问题。
(顺便说一下,另一个提示:在linq语句之外转换你的日期。当你这样做时,语句由.NET Framework转换,只有转换后的值才会传递给SQL,而不是整个转换操作,这是非常昂贵的)
答案 2 :(得分:0)
你可以用这样的东西来实现它
var tables = new List<string>{"INST_BOND","INST_EQUITY","INST_FUTURE"};
.........
.. id.IDENTIFIER_NAME = tables.Contains(ii.SPEC_TABLE)
? "ISIN"
: ii.SPEC_TABLE == "INST_CASH"
? id.IDENTIFIER_NAME == "XXX"
:ii.SPEC_TABLE == "INST_INDEX_RETURN_SWAP"
? "BBG_UNIQUE"
.........
这将是字面翻译,但您应该创建一个逻辑结构,例如dictionary
,例如ii.SPEC_TABLE
。并在执行linq后分配该值。如果你想使用linq,那么你需要有一个查找表并加入function members($group_id)
{
$this->db->where('group_id',$group_id);
$query = $this->db->query('SELECT COUNT(group_id) FROM member');
return $query;
}