sql - 选择在其中一列中具有指定值的行
问题描述
我的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
如何在其中一列中选择带有“ I ”的行?例如,我希望查询从表中返回第一行和第三行。
我知道下面的查询有效,但是我需要一个不指定列名的查询,因为我需要处理一个超过 20 列的表。
SELECT * FROM table WHERE (Status = 'I' or Address = 'I' or Phone = 'I')
解决方案
一种方法是使用 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 │
└────┴──────┴────────┴─────────┴───────┘
编辑:
排除某些列的更高级的选项。基本上模拟 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;
推荐阅读
- python - 拟合给定函数
- c# - 从 Objective-C 到 C# 的转换
- open-policy-agent - OPA 单元测试失败,如何输出响应变量?
- android - 在flutter webview中加载本地pdf文件
- typescript - 没有文件更改时,Docker 容器中的 TypeScript 监视触发增量构建
- android - Atbeacon onNonBeaconLeScan 未调用 Android 10
- jenkins - Jenkins 中的 RBAC:如何仅为用户和组管理创建自定义权限
- php - 如何存储具有动态选项和多个级别的各种嵌套列表?
- python-3.x - Flask 应用程序未返回预测值
- java - 在 RecyclerView 中创建 onClickListener