SQL NULL返回在使用odbc的php中给出空字符串

时间:2014-01-10 11:57:11

标签: php sql sql-server odbc

我有一个包含两个相同表的数据库(一个包含值,另一个包含值/用户)。在读取值时,我希望获取两个值并将它们放在一行上。在某些情况下(对于某些列),只有一个值而不是值/ 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.

中看到

1 个答案:

答案 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