我正在创建一个有趣的商店程序。
基本思想是输入字符串并输出表中的名称。这就是我希望它工作的方式:
我的问题是每个字符串中的单词数可能在输入字符串之间有所不同。我可以很容易地为1个单词,2个单词,3个单词等构建一组WHILE / IF语句。
但是我希望它只为每个单词声明一个变量。例如,假设我输入了字符串:'the rose'。然后,存储过程将仅声明2个变量(@ word1,@ word2)。
以下是我写的一些代码的开头:
CREATE PROCEDURE postcodes.sp_postcode @any_string VARCHAR(1000)
AS
BEGIN
-------count number of words-------
DECLARE @num_of_words INT
SELECT @num_of_words = LEN(@any_string) - LEN(REPLACE(@any_string,' ',''))
-------searching similar words-----
WHILE @num_of_words = 1
BEGIN
SELECT name
FROM [kats].[postcodes].[open_pubs]
WHERE name LIKE '%' + @any_string + '%'
END
WHILE @num_of_words = 2
BEGIN
DECLARE @word1
DECLARE @word2
SET @word1 = SUBSTRING(@any_string,0,(CHARINDEX(' ',@any_string,0)))
SET @word2 = SUBSTRING(@any_string,(CHARINDEX(' ',@name,0)+1),LEN(@any_string))
SELECT name
FROM [kats].[postcodes].[open_pubs]
WHERE name LIKE '%' + @word1 + '%'
OR name LIKE '%' + @word2 + '%'
END
正如您所看到的,我为每个案例的单词长度构建了语句。这可以无限期地继续下去。我想要一些类似的东西:
伪代码/想法:
DECLARE @word(word_number) [* number_of_words]
SET @word(word_number) = SUBSTRING(@any_string)
SELECT name FROM X
WHERE name LIKE '%' + @word1 + '%'
OR name LIKE '%' + @word2 + '%'
etc
我基本上不想继续为任何字符串创建WHILE语句。
亲切的问候。
答案 0 :(得分:2)
对于SQL Server 2016或更高版本,以下版本使用STRING_SPLIT内置函数时效果很好。对于较旧的,您只需使用其中一种备用机制将分隔的字符串转换为表格。
MS SQL Server 2017架构设置:
create table Test (name varchar(max))
insert Test values
('abc'), ('def'), ('efg'), ('hij')
查询1 :
DECLARE @tags nvarchar(max) = 'ab ef fg'
SELECT * FROM Test t
WHERE EXISTS (SELECT * FROM STRING_SPLIT(@tags, ' ') s
WHERE t.name LIKE '%' + s.value + '%')
<强> Results 强>:
| name |
|------|
| abc |
| def |
| efg |