我有一个包含两个相同表的数据库(一个包含值,另一个包含值/用户)。在读取值时,我希望获取两个值并将它们放在一行上。在某些情况下(对于某些列),只有一个值而不是值/ users-value,在这些情况下,我希望返回的值为null。
为了使事情更清楚,这是一个例子;
Value table (Table1) | id | CPU | Memory | Name | |------+-------+--------+--------| | 1 | 45 | 25 | Comp1 | | 2 | 25 | 12.5 | Comp2 | Value/Users table (Table2) | id | CPU | Memory | Name | |------+-------+--------+--------| | 1_A | 22.5 | 12.5 | | | 2_A | 5 | 2.5 | |
我不需要知道Name的值除以用户数。为了区分这些值与其余值,我有一个名为colInfo
的表,它使用变量columnName
指定第二个表中存在哪些值。 (注意:我无法修改数据库的结构)。
检索数据时,我使用以下SQL查询;
SELECT t1.[NAME] as Value, t2.[UserValue]
FROM (SELECT * FROM TABLE1 WHERE ID = 1) t1
left join (SELECT [ID],
CASE(SELECT COUNT(*) FROM colInfo WHERE [columnName] LIKE 'NAME')
WHEN 0 THEN NULL
ELSE [NAME]
END as [UserValue] from t2 on LEFT(t2.Id,LEN(t2.Id)-1) = LEFT(t1.Id,LEN(t1.Id)-1)
(子选择和左连接背后的推理伴随着我无法改变数据库结构的事实)
在SQL Management Studio中运行此查询时,我得到了正确的结果;
| ID | Value | UserValue | |----+-------+-----------| | 1 | Comp1 | NULL |
但是当使用odbc从php网站运行它时,我得到的是一个空字符串,而不是NULL
。我使用以下代码;
$query = $this->sqlFactory->getComputerStats($params,$ids);
$result = odbc_exec($this->conn, $query);
for ($j=1; $j<=$no_rows; $j++) {
odbc_fetch_row($result, $j);
if(!is_null(odbc_result($result,"UserValue"))){
echo odbc_result($result,"UserValue");
}
}
使用开发者工具,这将给我一个空字符串。如果我改为echo $query
并在SQL环境中测试它,我会得到NULL
值。
为什么odbc_result
不会将结果解析为null
?
编辑:根据odbc_result的文档,当SQL Query的值返回NULL时,它应返回null
。可以在documentation.
答案 0 :(得分:1)
主要与php如何看待null有关。在php中,null不是数据类型的可能值,但它本身就是它自己的数据类型。
所以当从数据库中检索数据时,odbc会发送一个数据类型以及一个值(可能为null),然后将其转换为php数据类型,从而不再适应数据库null的概念。包含null为空字符串的字符串的下一个最好的东西。
我认为这篇文章会有所帮助: In PHP, what is the differences between NULL and setting a string to equal 2 single quotes