2012-12-28 15 views
1

我正在制作一个类似于phpMyAdmin的自定义脚本。SQL选择所有带字符限制的列

我需要使用星号(*)才能选择表中的所有数据而不知道列。诀窍是我必须限制从每列中检索的数据量以提高效率。基本上做到这一点,

SELECT SUBSTR(Username, 20) FROM Users LIMIT 10 

其中username列限制了20个字符,但我不得不做这一切的同时这样

SELECT SUBSTR(*, 20) FROM Users LIMIT 10 

我选择所有怎么办我的数据在使用星号时每列都有特定的字符限制?

+0

有可能int型的数据库表他们怎么样 –

+1

您正在寻找http://stackoverflow.com/questions/8687970/mysql-directive-for-all-columns-to-run-through-substring –

回答

2

SELECT SUBSTR(COL1,20), SUBSTR(COL2,20),SUBSTR(COL3,20), .... FROM Users LIMIT 10

你必须限制每个列显式..

2

你必须指定你想要检索的所有列。

SELECT SUBSTR(Username,20) as user, SUBSTR(Column2,20) as col, FROM Users LIMIT 10 

你不能在你需要的方式使用mysql函数中的星号。每一列都必须受到限制。

1

作为替代方案,您可以在两个部分做到这一点。对于第一部分,运行:

SHOW COLUMNS IN Users; 

然后使用结果在该查询的字段列以编程方式生成的第二查询选择每一个在所述第一查询返回的列名。

2

另一种方法是创建一个动态SQL,你需要的是唯一的东西

  • 数据库名称
  • 表名

这里的查询:

SET @db = 'db_2_a8d87'; -- database name 
SET @tb = 'Table1';  -- table name 
SET @sql = NULL; 
SELECT GROUP_CONCAT(CONCAT('SUBSTRING(',column_Name,',1,3)', column_Name)) INTO @sql 
FROM information_schema.columns 
WHERE table_schema = @db AND table_name = @tb; 

SET @sql = CONCAT('SELECT ', @sql, ' FROM ', @tb); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt;