SQL Server SELECT,其中任何列包含'x'

nsi*_*lva 25 sql sql-server select sql-server-2008

使用SQL Server 2008,假设我有一个名为testing80列的表,我想找到一个名为的值foo.

我可以:

SELECT * 
FROM testing 
WHERE COLNAME = 'foo'
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Gor*_*off 25

你可以使用in:

SELECT *
FROM testing 
WHERE 'foo' in (col1, col2, col3, . . . );
Run Code Online (Sandbox Code Playgroud)

  • 哦。我的。善良。我已经使用 MySQL 大约 20 年了,但从未意识到 IN() 可以这样使用。我觉得很傻。这确实简化了我必须进行的查询。谢谢你!!! (4认同)
  • 谢谢,是否可以不定义每个列名称?@戈登·利诺夫 (3认同)
  • @GordonLinoff 如果您搜索确切的单词“foo”,它会起作用,但它不会以类似于“%foo%”的方式起作用。您也应该添加该变体。这与 IN 不同且不可能。 (2认同)

uba*_*raf 7

第一种方法(经过测试) 首先获取用逗号分隔的字符串变量中的列列表,然后使用该变量搜索"foo"IN

检查下面首先获取列的存储过程,然后搜索字符串:

DECLARE @TABLE_NAME VARCHAR(128)
DECLARE @SCHEMA_NAME VARCHAR(128)

-----------------------------------------------------------------------

-- Set up the name of the table here :
SET @TABLE_NAME = 'testing'
-- Set up the name of the schema here, or just leave set to 'dbo' :
SET @SCHEMA_NAME = 'dbo'

-----------------------------------------------------------------------

DECLARE @vvc_ColumnName VARCHAR(128)
DECLARE @vvc_ColumnList VARCHAR(MAX)

IF @SCHEMA_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=@TABLE_NAME AND S.name=@SCHEMA_NAME)
  BEGIN
  PRINT 'Error : The table '''+@TABLE_NAME+''' in schema '''+
      @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    = @TABLE_NAME
AND      S.name    = @SCHEMA_NAME
ORDER BY column_id


SET @vvc_ColumnList=''

OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @vvc_ColumnName

WHILE @@FETCH_STATUS=0
  BEGIN
   SET @vvc_ColumnList = @vvc_ColumnList + @vvc_ColumnName

    -- get the details of the next column
   FETCH NEXT FROM TableCursor INTO @vvc_ColumnName

  -- add a comma if we are not at the end of the row
   IF @@FETCH_STATUS=0
    SET @vvc_ColumnList = @vvc_ColumnList + ','
   END

 CLOSE TableCursor
 DEALLOCATE TableCursor

-- Now search for `foo`


SELECT *
FROM testing 
WHERE 'foo' in (@vvc_ColumnList );
Run Code Online (Sandbox Code Playgroud)

第二种方法 在sql server中,你可以得到表的对象id,然后使用你可以获取列的对象id.在这种情况下,它将如下:

第1步:首先获取表的Object Id

select * from sys.tables order by name    
Run Code Online (Sandbox Code Playgroud)

第2步:现在获取表格的列并在其中搜索:

 select * from testing where 'foo' in (select name from sys.columns  where  object_id =1977058079)
Run Code Online (Sandbox Code Playgroud)

注意:object_id是您在相关表的第一步中获取的内容

  • 嗨,我刚刚尝试过,我做了一个SELECT*FROM测试,找到了我想要返回检查的值,但是运行脚本只是没有返回任何内容.我已经更改了表名,底部的SELECT与我正在检查的数据库相匹配,没有什么我需要改变的吗? (2认同)
  • 对象名称是 Unicode,使用 NVARCHAR。不要编写内部引用 a-la `'['+ C.name +']' `,请使用 [`QUOTENAME`](https://msdn.microsoft.com/en-us/library/ms176114.aspx ),您没有正确处理带引号的标识符中的转义序列。始终引用一个名称,不仅当它包含空格时,还有更多问题字符(`\n`、`\t` 是明显的字符,但在 Unicode 空间中还有更多)。 (2认同)
  • 除了@RemusRusanu 提到的问题之外,“第一种方法”原则上不起作用。它(糟糕地)生成一个包含逗号分隔列名的字符串,并在“IN”子句中使用该字符串,这没有任何意义,相当于“WHERE 'foo' = 'column1,column2,column3'”,这不是去寻找任何东西。构建逗号分隔的列列表确实有意义,但它必须用于[构建动态 SQL](/sf/answers/206122871/)。 (2认同)