为了好玩我正在创建一个商店程序。
基本思想是输入字符串并输出表中的名称。这就是我想让它运作的方式:
我的问题是,每个字符串中的单词数在输入字符串之间可能有所不同。我可以很容易地建立一组时间/IF语句,包括1字、2字、3字等。
但是,我希望它只为每个单词声明一个变量。例如,我输入字符串:“玫瑰”。然后,存储过程将只声明2个变量(@word2 1,@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语句。
致以亲切的问候。
发布于 2018-04-10 11:20:17
对于Server 2016或更高版本,由于它使用了STRING_SPLIT内置函数,所以以下版本工作得很好。对于较旧的字符串,只需使用一种替代机制将分隔的字符串转换为表。
SQL Fiddle
MS 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 + '%')结果
| name |
|------|
| abc |
| def |
| efg |https://stackoverflow.com/questions/49751030
复制相似问题