1

文字列を連結するために次の SQL を短く/読みやすくする方法はありますか。

SELECT
   CONCAT(       
    IF(location_address1 != '',
       CONCAT(location_address1, ", "),
       ""
    ),
    IF(location_address2 != '',
       CONCAT(location_address2, ", "),
       ""
    ),
    IF(location_town != '',
       CONCAT(location_town, ", "),
       ""
    ),
    IF(location_region != '',
       CONCAT(location_region, ", "),
       ""
    ),
    IF(location_postcode != '',
       CONCAT(location_postcode, ", "),
       ""
    ),
    c.country_name
   )      
FROM
   countries c      
WHERE
   c.country_id = locations.country_id LIMIT 1
4

4 に答える 4

4

CONCAT_WS()は空の文字列をスキップしません。ただし、separator 引数の後の NULL 値はスキップされます。

NULLIF(expr1,expr2) expr1 = expr2 が true の場合は NULL を返し、そうでない場合は expr1 を返します。

あなたのクエリは次のようになります:

SELECT 
  CONCAT_WS(', ', 
       NULLIF(location_address1, ''),
       NULLIF(location_address2, ''),
       NULLIF(location_town, ''), 
       NULLIF(location_region, ''), 
       NULLIF(location_postcode, ''), 
       NULLIF(country_name, '')
  ) AS address
FROM
   countries c      
WHERE
   c.country_id = locations.country_id LIMIT 1
于 2012-08-17T09:42:27.043 に答える
2

@Xdazzによる

このトリムバージョン:

SELECT 
  CONCAT_WS(', ', 
       NULLIF(Trim(location_address1), ''),
       NULLIF(Trim(location_address2), ''),
       NULLIF(Trim(location_town), ''), 
       NULLIF(Trim(location_region), ''), 
       NULLIF(Trim(location_postcode), ''), 
       NULLIF(Trim(country_name), '')
  ) AS address
FROM
   countries c      
WHERE
   c.country_id = locations.country_id LIMIT 1
于 2013-02-15T07:18:50.583 に答える
1
SELECT
   REPLACE(CONCAT(IF(location_address1 != '',
       CONCAT(location_address1, ", "),location_address2,", ",location_town, ", ",location_region,", " , location_postcode , ", " ,c.country_name ),',,',',')    
FROM
   countries c      
WHERE
   c.country_id = locations.country_id LIMIT 1

私は構文をチェックしませんでしたが、私の考えは、それぞれが null か空かをチェックする代わりに、常に「,」で連結してから、すべての「,,」を「,」に置き換えてみませんか。

于 2012-08-17T09:48:02.310 に答える
1

MySQL でCONCAT_WS関数を次のように使用できます。

SELECT CONCAT_WS(',',IF(location_address1 = '', NULL, location_address1),
                     IF(location_address2 = '', NULL, location_address2),
                     IF(location_town = '', NULL, location_town),
                     IF(location_region = '', NULL, location_region),
                     IF(location_postcode = '', NULL, location_postcode),
                     c.country_name)  AS str
FROM countries c
WHERE c.country_id = locations.country_id
LIMIT 1;

または @Cyber​​Dem0n によって提案された単純なアプローチ:

SELECT CONCAT_WS(',',NULLIF(location_address1,''),
                     NULLIF(location_address2,''),
                     NULLIF(location_town,''),
                     NULLIF(location_region,''),
                     NULLIF(location_postcode,''),
                     c.country_name)  AS str
FROM countries c
WHERE c.country_id = locations.country_id
LIMIT 1;

NULLただし、値の代わりに値を保存できる場合は、より良いアプローチになりblankます。

于 2012-08-17T09:42:27.993 に答える