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

标签 mysql

我在 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'

注意:此示例显示的是 varchar(10) 数据类型,但实际上我还有 numeric 以及 var char 列。

最佳答案

您可以使用动态 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

如前所述@Madhur Bhaiya在评论中,您可以使用 MAX(CHAR_LENGTH(column_name))获取字段中 varchar 的最大长度。

对于单个字段,这个可以用used such as

SELECT CASE WHEN MAX(CHAR_LENGTH(col1)) <= 3 THEN 'col1' END AS colName FROM yourdatabasename.yourtablename

这将显示 'col1'如果MAX(CHAR_LENGTH(col1)) <= 3

现在您可以使用第一个查询来构建另一个 MySQL 查询:

SELECT 'SELECT * FROM ('
UNION
SELECT CONCAT('SELECT CASE WHEN MAX(CHAR_LENGTH(', `COLUMN_NAME`, ')) <= 3 THEN \'', `COLUMN_NAME`, '\' END AS colName FROM yourdatabasename.yourtablename\nUNION')
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA` = 'yourdatabasename' 
    AND `TABLE_NAME` = 'yourtablename'
    AND `DATA_TYPE` = 'varchar'
UNION
SELECT 'SELECT NULL) cols WHERE colName IS NOT NULL';

这将为您提供如下输出:

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

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

关于MySql - 选择数据长度小于 N 的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57625797/

相关文章:

mysql - 图书阅读器应用程序的数据库设计

php - 如何阻止 PHP 回显空白标签

php - 在函数php中获取json数据

php - 运行 PHP 或 MySQL 脚本以在时间间隔后执行任务

php - Mysql 查询根据邮政编码和类别获取最高票数

mysql - sql查询字符串中的整数

带有 UPDATE 语句的触发器内的 MySQL IF 语句

Mysql统计所有包含数字1、2、3或4的列

php - 通过 bash 脚本运行 php 脚本时出现 MySQL 数据库连接错误

php - date() 和夏令时的问题