php是空全球化选项吗?

php是空全球化选项吗?,php,mysql,null,Php,Mysql,Null,我有一个查询,选择了大约20列,都是varchar 有些是空的,这很好。但是我想为任何空列设置一个默认字符串“-----” 以下是迄今为止我所掌握的有效信息: $sql = "SELECT col1, "; $sql .= "IF(`col2` IS NULL,'----------',`col2`) AS `col2`, "; $sql .= "IF(`col3` IS NULL,'----------',`col3`) AS `col3`, "; $sql .= "IF(`col4` IS

我有一个查询,选择了大约20列,都是varchar

有些是空的,这很好。但是我想为任何空列设置一个默认字符串“-----”

以下是迄今为止我所掌握的有效信息:

$sql = "SELECT col1, ";
$sql .= "IF(`col2` IS NULL,'----------',`col2`) AS `col2`, ";
$sql .= "IF(`col3` IS NULL,'----------',`col3`) AS `col3`, ";
$sql .= "IF(`col4` IS NULL,'----------',`col4`) AS `col4`, ";
$sql .= "IF(`col5` IS NULL,'----------',`col5`) AS `col5`, ";
$sql .= "IF(`col6` IS NULL,'----------',`col6`) AS `col6`, ";
.......and so on.....
$sql .= "FROM `tableName`";

这对我来说是可行的,但我想知道是否有一种更“全局”的方法,而不是指定每一列。

也许实现这一点的一种稍微不太详细的方法是在SQL语句中使用COALESCE:

$sql = "SELECT col1, ";
$sql .= "COALESCE(col2,'----------'), ";
虽然不是真正的“全球”方式


也许有一个包含许多空列的表是一个可以改进数据库设计的指针,从而消除这种全局“空”替换的需要。

遵循mfloryan的建议,您可以使用循环和内爆()函数轻松生成字符串


因为您使用的是php,所以您至少可以循环使用一个具有列名的数组,使其更美观。请描述您试图实现的目标,因为理论上,关系数据库中不应该有空“值”。问题可能在于数据库的概念
<?php
$sql = 'select col1,';
$a = array();
for ($i=2;$i<=20;$i++){
$a[] = "coalesce(col".$i.",'-----') as col".$i."\r\n";
}
$sql.=implode(',',$a);
$sql.=" from table_name";
echo $sql;
?>
mysql> use test;
Database changed
mysql> create table dynSQL(
    -> col1 varchar(10),
    -> col2 varchar(10),
    -> col3 varchar(10),
    -> col4 varchar(10)
    -> ) engine = myisam;
Query OK, 0 rows affected (0.04 sec)

mysql>
mysql> insert into dynSQL(col1,col2,col3,col4)
    -> values (1,3,null,4),(10,null,4,null),(20,4,5,null);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql>
mysql> set @str = (select concat('select col1,',group_concat(concat("coalesce(",column_name,",'----') as ",column_name,"\n")),' from dynSQL')
    -> from information_schema.columns
    -> where table_schema = 'test' and table_name = 'dynSQL' and column_name like 'col%' and column_name <> 'col1');
Query OK, 0 rows affected (0.00 sec)

mysql> prepare stmt from @str;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> execute stmt;
+------+------+------+------+
| col1 | col2 | col3 | col4 |
+------+------+------+------+
| 1    | 3    | ---- | 4    |
| 10   | ---- | 4    | ---- |
| 20   | 4    | 5    | ---- |
+------+------+------+------+
3 rows in set (0.00 sec)

mysql> deallocate prepare stmt;
Query OK, 0 rows affected (0.00 sec)