SELECT在其中一列中具有指定值的行

时间:2018-06-14 05:59:54

标签: sql sql-server tsql sql-server-2012

我的 SQL Server 2012

上有以下表格
ID Name Status Address Phone
1  Tom    I       U      D
2  Joe    D       U      D
3  Pam    D       I      U
4  Ken    U       U      U

如何使用' '选择行?在其中一列?例如,我希望查询返回表中的第1行和第3行。

我知道下面的查询有效,但是我需要一个不指定列名的查询,因为我需要处理超过20列的表。

SELECT * FROM table WHERE (Status = 'I' or Address = 'I' or Phone = 'I')

2 个答案:

答案 0 :(得分:2)

一种方法是使用XML:

SELECT t.*
FROM tab t
CROSS APPLY (SELECT * FROM tab t2 WHERE t.id = t2.id FOR XML RAW('a')) sub(c)
WHERE sub.c LIKE '%"I"%';

输出:

┌────┬──────┬────────┬─────────┬───────┐
│ ID │ Name │ Status │ Address │ Phone │
├────┼──────┼────────┼─────────┼───────┤
│  1 │ Tom  │ I      │ U       │ D     │
│  3 │ Pam  │ D      │ I       │ U     │
└────┴──────┴────────┴─────────┴───────┘

<强> DBFiddle Demo

编辑:

排除某些列的更高级选项。基本上模拟SELECT * EXCEPT id, name

SELECT DISTINCT t.*
FROM tab t
CROSS APPLY (VALUES(CAST((SELECT t.* for XML RAW) AS xml))) B(XMLData)
CROSS APPLY (SELECT 1 c
             FROM B.XMLData.nodes('/row')  AS C1(n)
             CROSS APPLY C1.n.nodes('./@*') AS C2(a)
             WHERE a.value('local-name(.)','varchar(100)') NOT IN ('id','name')
               AND a.value('.','varchar(max)')  = 'I') C;

<强> DBFiddle Demo2

答案 1 :(得分:0)

如果没有任何提及列名,我不知道如何进行查询。这是一种使用字符串连接技巧的方法:

SELECT *
FROM yourTable
WHERE CONCAT(Status, Address, Phone) LIKE '%I%';

enter image description here

Demo

我认为在查询中列出20个列名称并不困难。如果您需要一种方法从SQL Server中的表中获取所有列,那么see here