簡體   English   中英

如何在SQL的where子句中串聯多個列?

[英]How to concatenate multiple columns in where clause in sql?

如果我要搜索一個城市地址,例如“奎松市”,就會有結果。 但是,如果我要搜索“馬尼拉大都會奎松市”這樣的城市地址和省份,那么應該沒有結果。

到目前為止,這是我的SQL查詢。

//TABLES
   t1 = street
   t3 = province
   t4 = city
   t5 = village

SELECT t1.*
     , t1.name AS propertyname
     , t2.name AS typeName
     , t3.name AS provName
     , t4.name AS cityName
     , t5.name AS brgyName
     , t6.imgpath_tn AS imgName
FROM proplistings AS t1
     LEFT JOIN proptypes AS t2 ON t2.id = t1.property_type_id
     LEFT JOIN tbl_province AS t3 ON t3.id = t1.prov_id 
     LEFT JOIN tbl_city AS t4 ON t4.id = t1.city_id
     LEFT JOIN tbl_barangay AS t5 ON t5.id = t1.brgy_id
     LEFT JOIN proplistings_images AS t6 ON t6.propid = t1.id
WHERE t1.deleted = 0
     AND t1.announceas = '1'
     AND t6.defaultimg = 1
     AND t6.imgpath != ''
     AND t1.status=1
     AND CONCAT(t1.street,', t5.name,', ', t4.name,', ', t3.name, ',t1.propcode,', ')
         LIKE '%Quezon City, Metro Manila%'
ORDER BY t1.date_added DESC

如果concat並且任何列包含null,則結果為null。 嘗試編碼為空。

例如

set @a = 'abc';
set @b = null;

select @a,@b,concat(@a,@b),
        concat(ifnull(@a,''),ifnull(@b,''));

+------+------+---------------+-------------------------------------+
| @a   | @b   | concat(@a,@b) | concat(ifnull(@a,''),ifnull(@b,'')) |
+------+------+---------------+-------------------------------------+
| abc  | NULL | NULL          | abc                                 |
+------+------+---------------+-------------------------------------+
1 row in set (0.00 sec)

我發現了2個問題。

我看到您按以下順序連接: ... + province + city + ...因此,如果Quezon City是城市, Metro Manila是省-級聯的結果看起來像: Metro Manila, Quezon City所以您必須使用LIKE '%Metro Manila, Quezon City%'而不是LIKE '%Quezon City, Metro Manila%'

另外,您還必須使用IFNULL以避免空值的串聯,因為如果CONCAT任何值將為NULL整個結果將為NULL

因此,您的WHERE子句應如下所示:

WHERE t1.deleted = 0
     AND t1.announceas = '1'
     AND t6.defaultimg = 1
     AND t6.imgpath != ''
     AND t1.status=1
     AND CONCAT(IFNULL(CONCAT(t1.street,', '), ''),
                IFNULL(CONCAT(t1.propcode,', '), ''), 
                IFNULL(CONCAT(t3.name,', '), ''), 
                IFNULL(CONCAT(t4.name,', '), ''), 
                IFNULL(CONCAT(t5.name,', '), '')
         )
         LIKE REPLACE(REPLACE('%Metro Manila, Quezon City%',' ','%'),',','%')

或者您可以使用動態SQL,例如:

DECLARE @SearchStr VARCHAR(1000)
DECLARE @Query VARCHAR(1000)

SET @SearchStr = 'Metro Mangila, Quezon City'

SET @Query = 'SELECT t1.*
                     , t1.name AS propertyname
                     , t2.name AS typeName
                     , t3.name AS provName
                     , t4.name AS cityName
                     , t5.name AS brgyName
                     , t6.imgpath_tn AS imgName
                FROM proplistings AS t1
                     LEFT JOIN proptypes AS t2 ON t2.id = t1.property_type_id
                     LEFT JOIN tbl_province AS t3 ON t3.id = t1.prov_id 
                     LEFT JOIN tbl_city AS t4 ON t4.id = t1.city_id
                     LEFT JOIN tbl_barangay AS t5 ON t5.id = t1.brgy_id
                     LEFT JOIN proplistings_images AS t6 ON t6.propid = t1.id
                WHERE t1.deleted = 0
                     AND t1.announceas = ''1''
                     AND t6.defaultimg = 1
                     AND t6.imgpath != ''''
                     AND t1.status=1
                     AND (
                     CONCAT(IFNULL(CONCAT(t1.street,'', ''), ''''),
                            IFNULL(CONCAT(t1.propcode,'', ''), ''''), 
                            IFNULL(CONCAT(t3.name,'', ''), ''''), 
                            IFNULL(CONCAT(t4.name,'', ''), ''''), 
                            IFNULL(CONCAT(t5.name,'', ''), '''')
                     ) LIKE ''%' + REPLACE(@SearchStr, ' ', '%'' 
                     OR 
                     CONCAT(IFNULL(CONCAT(t1.street,'', ''), ''''),
                            IFNULL(CONCAT(t1.propcode,'', ''), ''''), 
                            IFNULL(CONCAT(t3.name,'', ''), ''''), 
                            IFNULL(CONCAT(t4.name,'', ''), ''''), 
                            IFNULL(CONCAT(t5.name,'', ''), '''')
                     )  LIKE ''%' + '%'')'
EXEC(@Query)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM