SQL Server 是否可以编写一个T-SQL查询,该查询对同一列使用多个参数,并且使用AND而不是OR?(并且可以动态执行)

jdzmm42g  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(137)

我有一个包含一些长varchar的数据库,我想搜索包含多个参数的特定行。
假设我有一个文章1,其中的long varchar为AVJ 4 I4 LNK 45 Y 0 GEHV 023,那么我有一个包含以下参数的列表:AVJ、LNK、GEH。我希望能够识别包含所有这些参数的行。
所以基本上我会这样做:

SELECT *
FROM Products
WHERE description like '%AVJ%' AND
      description like '%LNK%' AND
      description like '%GEH%'

这样做很好,但问题是我不知道我将有多少参数,因为我从Excel电子表格中提取参数,并试图找到与这些参数匹配的行。
我找到的唯一合理的方法是包含(接近...),但现在我有SQL SERVER 2014 Express版,这个版本不支持全文搜索功能。
因此,现在我陷入了t-sql,试图创建一个过程,将我的所有{column like '%param %'}添加到一个循环或其他过程中,但它并没有真正工作。
它至少在t-sql中是可行的还是我走的是死胡同?我知道我甚至不应该这样做,因为SQL注入,但我没有看到任何其他的方式来做。

q0qdq0h2

q0qdq0h21#

一种方法是使用values语句构造查询,并使用joingroup by

SELECT p.ProductId
FROM Products p JOIN
     (VALUES ('AVJ'), ('LNK'), ('GEH')) vals(v)
     ON p.description LIKE '%' + vals.v + '%'
GROUP BY p.ProductId
HAVING COUNT(*) = (SELECDT COUNT(*) FROM vals);

然后,您可以使用split()或其他方法将其泛化,以将字符串转换为表:

WITH vals(v) as (
      SELECT *
      FROM dbo.split(@vals, ',')
     )
    SELECT p.ProductId
    FROM Products p JOIN
         vals
         ON p.description LIKE '%' + vals.v + '%'
    GROUP BY p.ProductId
    HAVING COUNT(*) = (SELECT COUNT(*) FROM vals);

您可以通过Google SQL Server split获得split()函数的实现。

vmdwslir

vmdwslir2#

将Excel文件加载到表中(SSIS或使用OPENROWSET)。

WITH conditionCountCTE (
  -- Get the count of conditions
  SELECT COUNT(*) conditionCount FROM excelTable
)
, ProductIDCTE (
  -- Find out how many conditions match
  SELECT ProductID
  FROM Product
  INNER JOIN excelTable
    ON Product.description LIKE N'%' + excelTable.condition + N'%'
  GROUP BY ProductID
  -- Get only those records where the condition count equals to match count
  HAVING COUNT(*) = conditionCountCTE.conditionCount
)
-- Get the data
SELECT
 *
FROM
 Products P
WHERE EXISTS (
  SELECT * FROM ProductIDCTE PCTE WHERE PCTE.ProductID = P.ProductID
)

相关问题