MySql-选择数据长度小于N长度的列

MySql-选择数据长度小于N长度的列,mysql,Mysql,我在mysql中有一个表,它包含将近150列。我想找出那些数据不超过3个字符的列名。我找不到数据类型长度小于3个字符的列 范例 +-----------------+-----------------+-----------------+ | Col1 (varchar10)| Col2 (varchar10)| col3 (varchar11)| +-----------------+-----------------+-----------------+ | 11

我在mysql中有一个表,它包含将近150列。我想找出那些数据不超过3个字符的列名。我找不到数据类型长度小于3个字符的列

范例

+-----------------+-----------------+-----------------+
| Col1 (varchar10)| Col2 (varchar10)| col3 (varchar11)|
+-----------------+-----------------+-----------------+
|              11 |            1212 |            1212 |
|               1 |             122 |              12 |
|              15 |             123 |          134444 |
+-----------------+-----------------+-----------------+
结果应该是这样的

+--------------+
| Column Names |
+--------------+
| Col1         |
+--------------+
| Col3         |
+--------------+.
因此,我遇到了打印列名的SQL,但长度是实际的列数据类型长度。我想要数据长度

SELECT column_name, 
       character_maximum_length 
FROM   information_schema.columns 
WHERE  table_schema = 'tvs' and table_name = 'xyz'

注意:本例显示了varchar10数据类型,但实际上我有数值列和VARCHAR列。

您可以使用动态SQL构建查询。有一些步骤

首先,您可能需要获取表的字段名:

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA` = 'yourdatabasename' 
    AND `TABLE_NAME` = 'yourtablename'
    AND `DATA_TYPE` = 'varchar'; -- This will get you only the varchar types fields
如注释中所述,您可以使用MAXCHAR_LENGTHcolumn_name获取字段中varchar的最大长度

对于单个字段,可以使用

SELECT CASE WHEN MAX(CHAR_LENGTH(col1)) <= 3 THEN 'col1' END AS colName FROM yourdatabasename.yourtablename
这将为您提供如下输出:

SELECT * FROM (
SELECT CASE WHEN MAX(CHAR_LENGTH(col1)) <= 3 THEN 'col1' END AS colName FROM yourdatabasename.yourtablename
UNION
SELECT CASE WHEN MAX(CHAR_LENGTH(col2)) <= 3 THEN 'col2' END AS colName FROM yourdatabasename.yourtablename
UNION
SELECT CASE WHEN MAX(CHAR_LENGTH(col3)) <= 3 THEN 'col3' END AS colName FROM yourdatabasename.yourtablename
UNION
SELECT NULL) cols WHERE colName IS NOT NULL

现在可以复制/粘贴此结果并将其作为查询。

使用Max CalthLangthCulnNyNoLy获得每列的最大字符长度,然后只考虑字符长度超过150列的位置。我正在寻找一种动态解决方案,不必显式地给出列名。否则,我需要找到所有的列名。我想打印列名。不是行。您可能希望构建一个存储过程,在所有列名的信息\u架构上进行迭代,从信息\u schema.COLUMNS中选择column\u NAME,其中table\u NAME='tbl\u NAME'。希望有人能提供一个很好的示例,但这应该可以让您开始了解如何获取列名。@Mubasher据我所知,您需要创建一个存储过程来完成此操作。看看这个问题的公认答案,让我试试。我认为这是最接近的一个。谢谢
SELECT * FROM (
SELECT CASE WHEN MAX(CHAR_LENGTH(col1)) <= 3 THEN 'col1' END AS colName FROM yourdatabasename.yourtablename
UNION
SELECT CASE WHEN MAX(CHAR_LENGTH(col2)) <= 3 THEN 'col2' END AS colName FROM yourdatabasename.yourtablename
UNION
SELECT CASE WHEN MAX(CHAR_LENGTH(col3)) <= 3 THEN 'col3' END AS colName FROM yourdatabasename.yourtablename
UNION
SELECT NULL) cols WHERE colName IS NOT NULL