从所有表列中查找值

时间:2014-05-14 04:18:22

标签: sql

我正在构建一个过滤所有列表数据的功能。

假设我有这张表:

-------------------------------------
| ID | NAME    | Address  | Remarks  |
| 1  | Manny   | Phil     | Boxer-US |
| 2  | Timothy | US       | Boxer    |
| 3  | Floyd   | US       | Boxer    |
| 4  | Maidana | US       | Boxer    |
| 5  | Marquez | MEX      | Boxer    |
-------------------------------------

我搜索“US”,它应该给我ID 1-4,因为“US”存在于他们的列中。

我可以用它来过滤它:

SELECT ID FROM tbl_Boxers 
WHERE ID LIKE '%US%' OR NAME LIKE '%US%' OR Address LIKE '%US%' OR Remarks LIKE '%US%'

但是我试图在这里避免使用长WHERE子句,因为在实际中,我有大约15列要看。

还有其他方法可以最小化where子句吗?

请帮忙。 感谢

2 个答案:

答案 0 :(得分:0)

检查以下解决方案。这里的查询是根据表中的列名动态生成的。

如果给定的表是物理表,则这是适用的。此解决方案不适用于临时表或表变量。

BEGIN TRAN

--Simulate your table structure
--Should be a physical table. Cannot be a temp table or a table variable
CREATE TABLE TableA
(
    ID INT,
    NAME VARCHAR(50),
    ADDRESS VARCHAR(50),
    REMARKS VARCHAR(50)
)

--Added values for testing
INSERT INTO TableA(ID, name , address ,remarks) VALUES(1,'Manny','Phil','Boxer-US')
INSERT INTO TableA(ID, name , address ,remarks) VALUES(2,'Timothy','US','Boxer')
INSERT INTO TableA(ID, name , address ,remarks) VALUES(3,'Floyd','US','Boxer')
INSERT INTO TableA(ID, name , address ,remarks) VALUES(4,'Maidana','US','Boxer')
INSERT INTO TableA(ID, name , address ,remarks) VALUES(5,'Marquez',' MEX','Boxer')

--Solution Starts from here 
DECLARE @YourSearchValue VARCHAR(50)--Will be passed
SET @YourSearchValue = 'US' --Simulated passed value

CREATE TABLE #TableCols
(
    ID INT IDENTITY(1,1),
    COLUMN_NAME VARCHAR(1000)
)


INSERT INTO #TableCols
(COLUMN_NAME)
SELECT COLUMN_NAME
FROM information_schema.columns
WHERE table_name = 'TableA';

DECLARE @STARTCOUNT INT, @MAXCOUNT INT, @COL_NAME VARCHAR(1000), @QUERY VARCHAR(8000), @SUBQUERY VARCHAR(8000)

SELECT @STARTCOUNT = 1, @MAXCOUNT = MAX(ID) FROM #TableCols;
SELECT @QUERY = '', @SUBQUERY = ''

WHILE(@STARTCOUNT <= @MAXCOUNT)
BEGIN
    SELECT @COL_NAME = COLUMN_NAME FROM #TableCols WHERE ID = @STARTCOUNT;
    SET @SUBQUERY = @SUBQUERY + ' CONVERT(VARCHAR(50), ' + @COL_NAME + ') LIKE ''%' + @YourSearchValue + '%''' + ' OR ';

    SET @STARTCOUNT = @STARTCOUNT + 1
END

SET @SUBQUERY = LEFT(@SUBQUERY, LEN(@SUBQUERY) - 3);
SET @QUERY = 'SELECT * FROM TableA WHERE 1 = 1 AND (' + @SUBQUERY + ')'
--PRINT (@QUERY);
EXEC (@QUERY);

ROLLBACK

希望这有帮助。

答案 1 :(得分:0)

通常这样做的方法是创建一个“可搜索字段”列,您可以将所有搜索列合并到一个字段中进行搜索。 因此,虽然这提供了更简单的概述和查询,但它添加了一些数据管理,您需要注意插入和更新。

同样是它自己 - 它不是一种最佳的搜索方式,所以如果性能很重要 - 那么你应该寻求实现全文搜索。

因此,问题在于您希望获得“开销”,以及您的建筑物是经常运行还是偶尔运行一次。
如果它是前者,性能很重要 - 请查看全文。如果它只是一次一次的查询,那么我自己只是执行长WHERE子句以避免在维护数据时增加更多开销