如何使用 SQL 选择数据长度大于给定长度的列

新手上路,请多包涵

我有一个包含特定列和行的表。我想选择数据长度超过 7 的列。

例如:表有列

Name      Address   PhoneNumber
AAA       AAAAAAAA   12345678
BBBBB     BBBBBBB    47854
CCC       FFFF       76643

这里的“地址”和“电话号码”列的数据长度超过 7。所以它应该显示,

地址

电话号码

作为结果。这是针对特定表的。这里我还不知道 Address 和 PhoneNumber 是数据长度大于 7 的列。只有从查询结果中我才能找到它。

SELECT <<all_columns>> from table where length(columns)>7 是我的输入要求。

‘Where’ 子句中的 LENGTH 或 LEN 函数提供了仅给出一个特定列名的选项

而不是 LENGTH(COL_NAME) ,我需要选择 where LENGTH(<> 或类似 LENGTH(*)) > 7 应该作为输入。

怎样才能做到这一点?

原文由 Sujatha Rajesh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 757
1 个回答

正如我所读到的,您需要一个动态 sql 来处理比您的示例更大的表(这应该是您问题的一部分)

我使用 unpivot 一次比较所有长度

DECLARE @TableName VARCHAR(100) = 'YourTableName'
DECLARE @MaxLen INT = 7

DECLARE @Definition
    TABLE (
        ColumnName VARCHAR(50)
    )

INSERT @Definition
SELECT C.Name
FROM
sys.columns C
JOIN sys.tables T
ON C.object_id = T.object_id
WHERE t.name = @TableName

DECLARE @Columns VARCHAR(MAX) = ''
DECLARE @ColumnsWithCast VARCHAR(MAX) = ''

SET @Columns = STUFF(
                    (SELECT ',' + ColumnName
                     FROM     @Definition
                     FOR XML PATH('')
                    ),
                    1,
                    1,
                    '')

SET @ColumnsWithCast = STUFF(
                    (SELECT ',CAST(' + ColumnName + ' AS VARCHAR(MAX)) AS ' + ColumnName
                     FROM     @Definition
                     FOR XML PATH('')
                    ),
                    1,
                    1,
                    '')

DECLARE @SQL NVARCHAR(MAX) = N'
SELECT DISTINCT
    Field
FROM (
        SELECT
            ' + @ColumnsWithCast + '
        FROM ' + @TableName + ' A
) p
UNPIVOT (
    Value FOR Field IN (
        ' + @Columns + '
    )
)AS unpvt
WHERE LEN(Value) > @MaxLen
'

DECLARE @ParamDefinition NVARCHAR(100) = N'@MaxLen INT'

EXEC sp_executesql @SQL, @ParamDefinition, @MaxLen = @MaxLen

它将使用所有现有列生成此代码

SELECT DISTINCT
    Field
FROM (
        SELECT
            CAST(Name AS VARCHAR(MAX)) AS Name,
            CAST(Address AS VARCHAR(MAX)) AS Address,
            CAST(PhoneNumber AS VARCHAR(MAX)) AS PhoneNumber,
        FROM HIERARCHY A
) p
UNPIVOT (
    Value FOR Field IN (
        Name, Address, PhoneNumber
    )
)AS unpvt
WHERE LEN(Value) > @MaxLen

原文由 Daniel Brughera 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进