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

时间:2018-04-10 10:14:00

标签: sql sql-server if-statement stored-procedures

我正在创建一个有趣的商店程序。

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

  1. 输入字符串
  2. 计算单词数
  3. 将字符串分成单独的单词(变量)
  4. 搜索每个单词在表格中的名称。
  5. 输出相似的名称
  6. 我的问题是每个字符串中的单词数可能在输入字符串之间有所不同。我可以很容易地为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语句。

    亲切的问候。

1 个答案:

答案 0 :(得分:2)

对于SQL Server 2016或更高版本,以下版本使用STRING_SPLIT内置函数时效果很好。对于较旧的,您只需使用其中一种备用机制将分隔的字符串转换为表格。

SQL Fiddle

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 |