我正在构建一个过滤所有列表数据的功能。
假设我有这张表:
-------------------------------------
| 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子句吗?
请帮忙。 感谢
答案 0 :(得分:0)
通常这样做的方法是创建一个“可搜索字段”列,您可以将所有搜索列合并到一个字段中进行搜索。 因此,虽然这提供了更简单的概述和查询,但它添加了一些数据管理,您需要注意插入和更新。
同样是它自己 - 它不是一种最佳的搜索方式,所以如果性能很重要 - 那么你应该寻求实现全文搜索。
因此,问题在于您希望获得“开销”,以及您的建筑物是经常运行还是偶尔运行一次。
如果它是前者,性能很重要 - 请查看全文。如果它只是一次一次的查询,那么我自己只是执行长WHERE子句以避免在维护数据时增加更多开销
答案 1 :(得分: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
希望这有帮助。