2011-03-04 48 views
0

我有一個查詢選擇約20列,都是varchars。php IS NULL全球化選項?

有些將是空的,這很好。但是我想爲任何空的列設置默認的「-------」字符串。

這裏是我到目前爲止,該工程:

$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`"; 

這對我的作品,但我想知道如果有更多的「全球性」的方式,而不是指定每一列。

+0

由於您使用的是PHP,所以您至少可以通過使用列名的數組循環訪問,使其更漂亮。 – chelmertz 2011-03-04 21:56:07

+0

描述你想要達到的目標,因爲從理論上講,關係數據庫中不應該存在空值「價值」。問題可能在於你的數據庫的概念 – 2011-03-04 21:59:38

回答

0

繼mfloryan建議你可以很容易地用循環生成的字符串和內爆()函數

<?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; 
?> 

編輯。請注意,information_schema是創建動態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) 

問候。 Nick

2

也許達到相同的略少冗長的方法是在你的SQL語句中使用COALESCE:

$sql = "SELECT col1, "; 
$sql .= "COALESCE(col2,'----------'), "; 

不是一個真正的「全球性」的方式,雖然;

也許有一個包含許多空列的表是一個指針,可以改進數據庫設計,而不需要這樣的全局'空'替換。