首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL:声明依赖于其他值的多个变量-存储过程

SQL:声明依赖于其他值的多个变量-存储过程
EN

Stack Overflow用户
提问于 2018-04-10 10:13:59
回答 1查看 980关注 0票数 0

为了好玩我正在创建一个商店程序。

基本思想是输入字符串并输出表中的名称。这就是我想让它运作的方式:

  1. 输入串
  2. 数一数字数
  3. 将字符串拆分为单独的单词(变量)
  4. 搜索每个单词是否像表中的名称。
  5. 输出相似的名称

我的问题是,每个字符串中的单词数在输入字符串之间可能有所不同。我可以很容易地建立一组时间/IF语句,包括1字、2字、3字等。

但是,我希望它只为每个单词声明一个变量。例如,我输入字符串:“玫瑰”。然后,存储过程将只声明2个变量(@word2 1,@word2)。

下面是我正在编写的一些代码的开始:

代码语言:javascript
复制
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

如您所见,我对每种情况都有构建语句(以字长表示)。这种情况可以无限期地持续下去。我想要这样的东西:

伪代码/想法:

代码语言:javascript
复制
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语句。

致以亲切的问候。

EN

回答 1

Stack Overflow用户

发布于 2018-04-10 11:20:17

对于Server 2016或更高版本,由于它使用了STRING_SPLIT内置函数,所以以下版本工作得很好。对于较旧的字符串,只需使用一种替代机制将分隔的字符串转换为表。

SQL Fiddle

MS Server 2017架构设置

代码语言:javascript
复制
create table Test (name varchar(max))

insert Test values 
  ('abc'), ('def'), ('efg'), ('hij')

查询1

代码语言:javascript
复制
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 + '%')

结果

代码语言:javascript
复制
| name |
|------|
|  abc |
|  def |
|  efg |
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49751030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档