gpt4 book ai didi

sql - ODBC Excel SQL 条件

转载 作者:行者123 更新时间:2023-12-04 20:52:29 25 4
gpt4 key购买 nike

我需要通过带有 的 ODBC 构建 SQL 查询来读取 Excel 文件。 Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb) .

该查询需要SELECT 中的条件语句。表示“如果 A 页面中的列 TA 具有值 x ,则 R1 ,否则 R2 ”,R1R2是相同类型的值( 01'ABC''DEF' )。

CASE它通常会给

SELECT CASE A WHEN x THEN R1 ELSE R2 END AS RA FROM TA;

或者
SELECT CASE WHEN A = x THEN R1 ELSE R2 END AS RA FROM TA;

这会产生一个错误,指出缺少运算符。

环顾四周,我读到 Access(因为没有人对 Excel 有任何意见)没有 CASE陈述。

然后我尝试了 IIF陈述,
SELECT IIF (A = x, R1, R2) AS RA FROM TA;

这不起作用,根据我如何表达条件(我使用 Vanilla CRecordset 对象,它在 Open 调用上失败,我没有做 DoFieldExchange无处),

然后我尝试了 SWITCH陈述
SELECT SWITCH (A = x, R1, true, R2) AS RA FROM TA;

也失败了(“参数太少。预计 1 个。”),然后我尝试了 CHOOSE陈述
SELECT CHOOSE (1*(A = x), R1, R2) AS RA FROM TA;

令人惊讶的是,这不起作用,结果相同。

我还用 RA = ... 尝试了所有这些查询。而不是 ... AS RA ,无济于事。

如何通过 ODBC 在针对 Excel 文件的 SQL 查询中正确表达条件?

编辑:我知道假设无知是其中的常态,所以让我说清楚, [A]TA 中的一列, R1R2只需表达所需的值,在我的情况下,这些是文字值(分别为 7270)。我的查询也大得多,从 joins 请求多个列与 wheresorder by ,到目前为止,我的所有查询都运行良好,使用简单的 CRecordset我会调用的对象 GetFieldValue从。我添加条件语句以开始失败的任何查询。我已经对我的工作进行了广泛的调试,并且据我所知,查询的格式正确(没有丢失括号等)。我也不知道这些陈述是不受支持的;欢迎对我的语法进行更正。

我不能简单地得到 TA.A然后在代码中处理它的值,我不能使用 API 或不同的驱动程序来访问数据。

编辑2:
@冻糕:
CDatabase *here_db = new CDatabase () ;
here_db->OpenEx ("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=C:\\ExcelFile.xls") ;
CRecordset *here_rs = new CRecordset (here_db) ;
here_rs->Open (CRecordset::snapshot, "SELECT COUNT(*) FROM [TableA$]", CRecordset::readOnly) ;
//This works, btw.
int rowCount ;
CDBVariant v ;
here_rs->GetFieldValue ((short) 0, v, SQL_C_SLONG) ;
rowCount = v.m_lVal ;
here_rs->Close () ;
here_rs->Open (CRecordset::snapshot, CString (
"SELECT"
" CASE A"
" WHEN 'test' THEN 72"
" ELSE 70"
" END AS RA"
" FROM [TableA$]"
""), CRecordset::readOnly) ;
short i ;
int colCount ;
colCount = here_rs->GetODBCFieldCount () ;
CString h ("") ;
while (!here_rs->IsEOF ())
{
for (i = 0; i < c; i++)
{
here_rs->GetFieldValue (i, h) ;
}
here_rs->MoveNext () ;
}
here_rs->Close () ;
delete here_rs ;
here_db->Close () ;
delete here_db ;
return TRUE ;

Edit3:这是 CPP/Cli。

Jet 和 Ace 数据提供者使用 OLEDB 对象,我不知道您可以将它们与 CDatabase/CRecordset 一起使用。

周末后我又回到了这个,重建我的查询,检查了所有的表名、文件路径、列名等,尝试了一个 IFF,它成功了。使用 Microsoft Excel 驱动程序等。我假设我在某处犯了语法错误,但我一辈子都无法弄清楚它是什么。无论如何,这里是结束工作的查询:
if (!here_rs->Open (CRecordset::snapshot,
"SELECT"
" `A`,"
" IIF(`A` = x, 72, 70) AS RA"
" FROM `TableA$`"
"", CRecordset::readOnly))
{
__debugbreak () ;
}

既然 Parfait 的答案是正确的,我会这样标记它。如果有人知道,我仍然欢迎对发生的事情进行解释。

最佳答案

在 Windows 环境中查询 Excel 工作簿将涉及 JET/ACE SQL 引擎(Windows .dll 文件),该引擎与 MS Access 中使用的引擎完全相同。由于此 SQL 方言不支持 ANSI 的 CASE声明,最好的等价物是 IIF function .从你的陈述中:

[A] IS a column in TA, R1 and R2 just express the desired values



然后,您的 IIF如果使用字母数字,则表达式必须将测试和所需值视为带引号的文字。否则引擎假定它们是表中的字段。请注意:您可以在 IIF 中使用实际列.此外,为 TA 指定使用表别名。
SELECT IIF(TA.A = 'test', 'R1', 'R2') AS RA 
FROM [TableA$] AS TA

对于尝试代码中使用的数字值,不要引用它们。在这两个表达式中,您都在隐式分配数据类型(分别为字符串和整数),同时将值显式分配给新的计算列 RA:
SELECT IIF(TA.A = 'test', 72, 70) AS RA 
FROM [TableA$] AS TA

关于sql - ODBC Excel SQL 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55065382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com