SQL Server SELECT语句,其中任意列包含'x'。

35 浏览
0 Comments

SQL Server SELECT语句,其中任意列包含'x'。

使用SQL Server 2008,假设我有一个名为testing的表,有80个列,并且我想找到一个名为foo的值。

可以这样做:

SELECT * 
FROM testing 
WHERE COLNAME = 'foo'

是否可能查询所有80列,并返回包含任何80列中的foo的所有结果?

0
0 Comments

问题出现的原因是,当在SQL Server中使用SELECT语句的WHERE子句时,希望在任意列中包含特定的字符或字符串。然而,如果表中包含整数列,则以上提到的方法将无法正常工作。

为了解决这个问题,可以使用动态SQL语句和EXECUTE sp_executesql来实现。首先,需要声明一些变量来存储表名、字符或字符串、列名等信息。然后,通过使用IN子句和FOR XML PATH将列名动态地组合成一个字符串。最后,将动态SQL语句和参数传递给EXECUTE sp_executesql来执行查询。

以下是解决方法的示例代码:

DECLARE @tableName nvarchar(200)
DECLARE @searchValue nvarchar(200)
DECLARE @columnNames nvarchar(2100)
DECLARE @sql nvarchar(2000)
SET @tableName = 'tbltemp'
SET @searchValue = '5'
SET @columnNames = (
 SELECT LEFT(column_name, LEN(column_name) - 1)
 FROM (
    SELECT column_name + ', '
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE table_name = @tableName
    FOR XML PATH ('')
  ) c (column_name )
)
SET @sql = 'SELECT * FROM ' + @tableName + ' WHERE ''' + @searchValue + ''' IN (' + @columnNames + ')'
EXECUTE sp_executesql @sql

通过使用上述方法,即使表中包含整数列,也可以实现在任意列中包含特定字符或字符串的查询操作。

0
0 Comments

问题的出现原因:

出现这个问题是因为用户想要在SQL Server中查询包含特定字符的任意列,但不想手动定义每个列名。

解决方法:

一种解决方法是使用in关键字,具体代码如下:

SELECT *
FROM testing 
WHERE 'foo' in (col1, col2, col3, . . . );

另一种解决方法是通过使用XML技巧和information_schema.columns来获取列名,具体代码如下:

'SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'testing';'

还有一种解决方法是使用LIKE关键字来实现模糊搜索,具体代码如下:

SELECT * FROM testing WHERE col1 LIKE '%foo%' OR col2 LIKE '%foo%' ...

这种方法在搜索包含特定字符的列时非常有用,可以避免手动定义每个列名。

以上是解决在SQL Server中查询包含特定字符的任意列的问题的几种方法。通过使用in关键字、XML技巧和information_schema.columns以及LIKE关键字,用户可以轻松地实现这个功能。其中in关键字是最简单和常用的方法。希望这些方法能帮助到需要查询包含特定字符的任意列的用户。

0
0 Comments

SQL Server SELECT语句中使用WHERE子句来查找任何列包含特定字符的记录。有两种方法可以实现这个目标。

第一种方法是通过将列名存储在逗号分隔的字符串变量中,然后使用IN来搜索包含特定字符的记录。下面是一个存储过程的示例,首先获取列名,然后搜索包含特定字符的记录:

DECLARE _NAME VARCHAR(128)
DECLARE _NAME VARCHAR(128)
-----------------------------------------------------------------------
-- 在这里设置表名:
SET _NAME = 'testing'
-- 在这里设置模式名,或者保持为'dbo':
SET _NAME = 'dbo'
-----------------------------------------------------------------------
DECLARE _ColumnName VARCHAR(128)
DECLARE _ColumnList VARCHAR(MAX)
IF _NAME =''
  BEGIN
  PRINT 'Error : No schema defined!'
  RETURN
  END
IF NOT EXISTS (SELECT * FROM sys.tables T JOIN sys.schemas S
      ON T.schema_id=S.schema_id
      WHERE T.Name=_NAME AND S.name=_NAME)
  BEGIN
  PRINT 'Error : The table '''+_NAME+''' in schema '''+
      _NAME+''' does not exist in this database!' 
  RETURN
 END
DECLARE TableCursor CURSOR FAST_FORWARD FOR
SELECT   CASE WHEN PATINDEX('% %',C.name) > 0 
     THEN '['+ C.name +']' 
     ELSE C.name 
     END
FROM     sys.columns C
JOIN     sys.tables T
ON       C.object_id  = T.object_id
JOIN     sys.schemas S
ON       S.schema_id  = T.schema_id
WHERE    T.name    = _NAME
AND      S.name    = _NAME
ORDER BY column_id
SET _ColumnList=''
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO _ColumnName
WHILE @_STATUS=0
  BEGIN
   SET _ColumnList = _ColumnList + _ColumnName
    -- 获取下一列的详细信息
   FETCH NEXT FROM TableCursor INTO _ColumnName
  -- 如果不是行末尾的话,添加逗号
   IF @_STATUS=0
    SET _ColumnList = _ColumnList + ','
   END
 CLOSE TableCursor
 DEALLOCATE TableCursor
-- 现在搜索包含'foo'的记录
SELECT *
FROM testing 
WHERE 'foo' in (_ColumnList );

第二种方法是通过获取表的对象ID,然后使用该对象ID获取列名。具体步骤如下:

第一步:获取表的对象ID

select * from sys.tables order by name    

第二步:获取表的列名并在其中搜索特定字符

select * from testing where 'foo' in (select name from sys.columns  where  object_id =1977058079)

需要注意的是,object_id是在第一步中获取的与相关表对应的值。

需要注意的是,第一种方法需要创建存储过程,而第二种方法更简单。此外,还需要注意使用NVARCHAR来处理对象名称,并使用QUOTENAME函数进行引用,以便正确处理引号和转义序列。

除了上述问题之外,第一种方法实际上并不能实现目标。它生成了一个包含逗号分隔的列名字符串,并在IN子句中使用该字符串,这没有意义,并等同于WHERE 'foo' = 'column1,column2,column3',这将无法找到任何记录。构建逗号分隔的列名列表是有意义的,但必须将其用于构建动态SQL。

0