如何使用SQL根据数字查询列
考虑下表,假设我们得到了一个数字 假设是2,我们想找到列name中的所有行,该列以结尾 和2。在本例中为b2如何使用SQL根据数字查询列,sql,sql-server,tsql,Sql,Sql Server,Tsql,考虑下表,假设我们得到了一个数字 假设是2,我们想找到列name中的所有行,该列以结尾 和2。在本例中为b2 Personid Ac1 b2 yt3 =============================== 1 Red small 54 2 Green Big 22 3 Red Big 21 到目前为止,我还没有找到答案。(每个列名都以一个唯一的数字结尾)
Personid Ac1 b2 yt3
===============================
1 Red small 54
2 Green Big 22
3 Red Big 21
到目前为止,我还没有找到答案。(每个列名都以一个唯一的数字结尾)您可以通过一些技巧使用动态查询来实现这一点。 您使用xml技巧从该表的信息架构表中获取列,格式为
b2,d2
,然后用该字符串替换*
,结果是从TestColumns
中选择b2,d2。将此语句传递给EXEC
函数:
CREATE TABLE TestColumns
(
a1 INT ,
b2 INT ,
c3 INT ,
d2 INT
)
GO
INSERT INTO TestColumns
VALUES ( 1, 1, 1, 1 ),
( 2, 2, 2, 2 )
DECLARE @s NVARCHAR(MAX) = 'select * from TestColumns'
DECLARE @cols NVARCHAR(MAX) = ( SELECT STUFF(( SELECT ',' + COLUMN_NAME AS [text()]
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'TestColumns'
AND COLUMN_NAME LIKE '%2'
FOR
XML PATH('')
), 1, 1, '')
)
SET @s = REPLACE(@s, '*', @cols)
EXEC (@s)
输出:
b2 d2
1 1
2 2
如果有唯一的索引列,则可以简化为:
DECLARE @s NVARCHAR(MAX) = 'select * from TestColumns'
DECLARE @col NVARCHAR(MAX) = ( SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'TestColumns'
AND COLUMN_NAME LIKE '%2'
)
SET @s = REPLACE(@s, '*', @col)
EXEC (@s)
我使用以下查询:
DECLARE @Str nvarchar(max) = 'SELECT '
DECLARE @TableName varchar(max) = 'yourTable', @PostFix int = 2
SELECT
@Str = @Str + '[' + t.name + '].[' + c.name + '],'
FROM
sys.tables t
LEFT OUTER JOIN
sys.columns c ON t.[object_id] = c.[object_id]
WHERE
t.name = @TableName
AND
c.name like '%' + CAST(@PostFix AS varchar(2))
SET @Str = SUBSTRING(@Str, 1, LEN(@Str) - 1) + ' FROM ' + @TableName
EXEC(@Str)
您必须使用动态SQL。我需要以某种方式查找列名,然后查看哪一个以2Yes结尾,而您无法在查询中“查找列名”。您需要在元数据中找到列名(
sys.columns
),然后使用dynamic SQL.Hmmm构建一个查询,为什么不呢?我知道它们都在一个系统表中。因为T-SQL不是这样工作的-您最终提交给SQL Server的查询中的列和其他实体名需要定义良好。您需要动态地构建查询;您不能仅将表与系统目录联接以确定在运行时返回哪些列。您可能需要考虑不同的设计。这可以更简单,因为OP声明每个列名称以唯一的编号结束,因此不会有<代码> B2 < /代码>和<代码> D2< /代码>。