Rai*_*616 5 php sql sql-server odbc case
在我的PHP Web应用程序中,我试图完善逻辑,即用户定义的值,组装一个Transact-SQL查询,该查询过滤该值.然后使用ODBC驱动程序执行查询.复杂的是,过滤仅在派生字段上完成.除了派生字段是使用CASE表达式创建的字段时,这工作正常.
因此,例如,我有一个派生字段,如下所示:
CASE WHEN [text_result] IS NOT NULL THEN [text_result] ELSE
CASE WHEN [last_event] = 1 THEN 'processed' ELSE 'unprocessed' END
END
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用值"unprocessed"过滤它,那么最终的汇编查询显然类似于以下内容:
SELECT * FROM table WHERE
CASE WHEN [text_result] IS NOT NULL THEN [text_result] ELSE
CASE WHEN [last_event] = 1 THEN 'processed' ELSE 'unprocessed' END
END = 'unprocessed'
Run Code Online (Sandbox Code Playgroud)
但是,当这次运行时,我收到以下错误:
Warning: odbc_execute(): SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'from'., SQL state 37000 in SQLDescribeParameter in
Run Code Online (Sandbox Code Playgroud)
我已经尝试运行SQL分析器,发现在初始语句准备期间似乎抛出了错误,并且语句准备SQL似乎是从字段名称截断表达式.所以它看起来像这样:
SET FMTONLY ON select CASE WHEN [text_result] from table where 1=2 SET FMTONLY OFF go
Run Code Online (Sandbox Code Playgroud)
当我通过MSSQL管理工作室运行生成的SQL语句时,这已得到确认,并且工作正常!
我希望一切都有道理.如果有人有任何建议,如果这个问题是可以解决的,或者它只是驱动程序中的一个错误,那就太好了!
这是我用来运行汇编查询的PHP(从类中提取):
$link = odbc_connect($strConnectionString,$username,$password);
$rResult = odbc_prepare($link,$qry);
$success = odbc_execute($rResult,$parameters);
Run Code Online (Sandbox Code Playgroud)
后续代码var_dump($ QRY,$参数):
string 'SELECT * FROM table WHERE
CASE WHEN [text_result] IS NOT NULL THEN [text_result] ELSE
CASE WHEN [last_event] = 1 THEN 'processed' ELSE 'unprocessed' END
END = ?'
array (size=1)
0 => string 'unprocessed'
Run Code Online (Sandbox Code Playgroud)
首先,您不需要嵌套case
语句。你可以这样做:
CASE WHEN [text_result] IS NOT NULL THEN [text_result]
WHEN [last_event] = 1 THEN 'processed'
ELSE 'unprocessed'
END
Run Code Online (Sandbox Code Playgroud)
我认为你的错误之一select
是=
. 你可以写:
SELECT unprocessed = (CASE WHEN [text_result] IS NOT NULL THEN [text_result]
WHEN [last_event] = 1 THEN 'processed'
ELSE 'unprocessed'
END)
Run Code Online (Sandbox Code Playgroud)
或者
SELECT (CASE WHEN [text_result] IS NOT NULL THEN [text_result]
WHEN [last_event] = 1 THEN 'processed'
ELSE 'unprocessed'
END) as unprocessed
Run Code Online (Sandbox Code Playgroud)
但是,当使用 时=
,变量排在第一位。
然后,我认为您不能使用 指定列别名?
。您必须使用其中的列别名来构造查询字符串。
归档时间: |
|
查看次数: |
1243 次 |
最近记录: |