Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查找字符串_Sql_Sql Server - Fatal编程技术网

SQL查找字符串

SQL查找字符串,sql,sql-server,Sql,Sql Server,我想知道是否可以从另一个表中查找字符串。这有点复杂 这是桌子:(待定菜) 从上表中,我想从另一个表中获取有关列dish的单独描述 第二张桌子(tbl_食品) 假设我的查询如下:(但它是错误的) 我期望的结果是: | food | Description | | egg | Fresh | | hotdog | red | | bread | toasted | 这就像在dish列中获得所有匹配的单词。我不知道这是否

我想知道是否可以从另一个表中查找字符串。这有点复杂

这是桌子:(待定菜)

从上表中,我想从另一个表中获取有关列dish的单独描述

第二张桌子(tbl_食品)

假设我的查询如下:(但它是错误的)

我期望的结果是:

    | food   | Description |
    | egg    | Fresh       |
    | hotdog | red         |
    | bread  | toasted     |
这就像在dish列中获得所有匹配的单词。我不知道这是否可能。请帮忙


谢谢。

您需要拆分列表

SELECT food, description 
FROM tbl_Foods
join tbl_Dishes 
on tbl_Dishes.dish like ('%' + tbl_Foods.food +'%')
DECLARE @DelimString VARCHAR(100)
SET DelimString  = SELECT REPLACE(REPLACE(dish,'&',','),' ', '') FROM tbl_Dishes

DECLARE @Dish TABLE (Dish VARCHAR(50)); INSERT INTO @Dish SELECT CAST(ParamValue AS VARCHAR) FROM MultiValueParams_String(@DelimString)  
使用此功能

Create function [dbo].[MultiValueParams_String] (@ParamList varchar(4000))
returns @Values table (RoNum INT,ParamValue varchar(4000)) 
as 
begin
declare @Delim char(1) = ',' -- comma is always the delimiter
declare @Chrind int = 1
declare @Piece nvarchar(50)
declare @RoNum int = 0
while @Chrind>0
    begin 
        select @Chrind=charindex(@Delim,@ParamList)
        if @Chrind>0
            select @Piece=left(@ParamList,@chrind-1)
        else 
            select @Piece=@ParamList
        insert @values(RoNum,ParamValue) values (@RoNum,@Piece)
        select @ParamList = right(@ParamList,len(@ParamList)-@chrind)
        if len(@ParamList)=0 break
        SELECT @RoNum = @RoNum + 1
    end 
return
end

SELECT food, description 
FROM tbl_Foods f
INNER JOIN @Dish d ON f.food = d.dish 

类似这样的东西。

描述从何而来?它来自tbl_食品。那么您可以添加
tbl_食品的结构吗
请问您使用的是哪种DBMS?并不是说使用
+
进行字符串连接是非标准SQL(问题只标记为
SQL
而不是特定的DBMS产品)这种类型的分离器绝对是最差的。从性能的角度来看,它是如此糟糕,以至于它甚至没有列出拆分器列表,以便在创建和分析不同类型的人员之间进行比较。这里有一个链接,指向比这个基于循环的版本更好的拆分器。这里增加的性能挑战是多语句表值函数。这些函数几乎总是比标量函数慢。当然还有循环…@SeanLange谢谢你的链接。现在我要更新我的数据库了,我已经看到了。太棒了。很高兴我能分享一些改进方面的知识D
SELECT food, description 
FROM tbl_Foods
join tbl_Dishes 
on tbl_Dishes.dish like ('%' + tbl_Foods.food +'%')
DECLARE @DelimString VARCHAR(100)
SET DelimString  = SELECT REPLACE(REPLACE(dish,'&',','),' ', '') FROM tbl_Dishes

DECLARE @Dish TABLE (Dish VARCHAR(50)); INSERT INTO @Dish SELECT CAST(ParamValue AS VARCHAR) FROM MultiValueParams_String(@DelimString)  
Create function [dbo].[MultiValueParams_String] (@ParamList varchar(4000))
returns @Values table (RoNum INT,ParamValue varchar(4000)) 
as 
begin
declare @Delim char(1) = ',' -- comma is always the delimiter
declare @Chrind int = 1
declare @Piece nvarchar(50)
declare @RoNum int = 0
while @Chrind>0
    begin 
        select @Chrind=charindex(@Delim,@ParamList)
        if @Chrind>0
            select @Piece=left(@ParamList,@chrind-1)
        else 
            select @Piece=@ParamList
        insert @values(RoNum,ParamValue) values (@RoNum,@Piece)
        select @ParamList = right(@ParamList,len(@ParamList)-@chrind)
        if len(@ParamList)=0 break
        SELECT @RoNum = @RoNum + 1
    end 
return
end

SELECT food, description 
FROM tbl_Foods f
INNER JOIN @Dish d ON f.food = d.dish