Как выбрать столбцы с помощью SQL, длина данных которого больше заданной длины - PullRequest
0 голосов
/ 21 января 2019

У меня есть таблица с конкретными столбцами и строками. Я хотел бы выбрать столбцы, у которых есть данные больше, чем длина 7.

Например: Таблица имеет столбцы

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

Здесь столбцы «Адрес» и «Номер телефона» имеют длину данных более 7. Поэтому должно отображаться,

Адрес
PhoneNumber

как результат. Это для конкретной таблицы. Здесь я уже не знаю, что Address и PhoneNumber - это столбцы, в которых есть данные, длина которых превышает 7. Только из результата запроса я смогу найти его.

SELECT <<all_columns>> from table where length(columns)>7 - мое требование к вводу.

Функции LENGTH или LEN в предложении «Где» позволяют задать только одно конкретное имя столбца

вместо LENGTH(COL_NAME), мне нужна опция, где ДЛИНА (<> или что-то вроде LENGTH(*)) > 7 должно быть задано в качестве ввода.

Как этого можно достичь?

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Таким образом, HAVING - это, вероятно, пункт, который вы хотите использовать. Очевидно, что вы можете расширить, чтобы включить все столбцы и увеличить количество. увидеть это:

 SELECT 
      Name,
      Address, 
      Phonenumber, 
      LEN(Address) AS AddyLength
 FROM
      yourTables
 GROUP BY
      Name,
      Address, 
      Phonenumber, 
 HAVING
      LEN(Address)>7
0 голосов
/ 21 января 2019

Когда я читаю, вам нужен динамический 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
0 голосов
/ 21 января 2019

Если вы можете жить с результатами в столбцах, а не в строках:

select (case when max(length(name)) > 7 then 'Name;' else '' end) ||
       (case when max(length(address)) > 7 then 'address;' else '' end) ||
       (case when max(length(phone)) > 7 then 'phone;' else '' end) 
from t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...