2017-01-18 5 views
2

こんにちは私はこれをmySQLで試行しています。 SELECT IFとCASEを使ってタイトルを変更しようとしました。すべてのタイトルの説明には、説明の前に「A」が付​​いています。たとえ2番目の単語が子音で始まってもだから、私は説明を照会しようとしているが、 "An"で始まるような先導的な子音でそれらを編集しようとしている。ケース構文エラー

CASE 
    WHEN description LIKE ('A A%') THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description)) 
    WHEN description LIKE ('A E%') THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description)) 
    WHEN description LIKE ('A I%') THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description)) 
    WHEN description LIKE ('A O%') THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description)) 
    WHEN description LIKE ('A U%') THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description)) 
END; 

この特定のコードは、私にエラーコード:1064の構文を与えていました。

SELECT IF(description NOT LIKE ('A A%'), NULL, CONCAT('An ', TRIM(LEADING 'A ' FROM description))), 
    IF(description NOT LIKE ('A E%'), null, CONCAT('An ', TRIM(LEADING 'A ' FROM description))), 
    IF(description NOT LIKE ('A I%'), NULL, CONCAT('An ', TRIM(LEADING 'A ' FROM description))), 
    IF(description NOT LIKE ('A O%'), NULL, CONCAT('An ', TRIM(LEADING 'A ' FROM description))), 
    IF(description NOT LIKE ('A U%'), NULL, CONCAT('An ', TRIM(LEADING 'A ' FROM description))) 
FROM film_text;  

この特定のコードブロックは別の列を返しますが、このすべてを1つの列に照会しようとしています。

私のIFブロックが戻る何

+0

最初の 'CASE'式が正しいトラックに表示されます。その出力は何ですか? –

+0

[here](http://www.inmotionhosting.com/support/website/database-troubleshooting/error-1064)のリストを実行すると、問題の追跡に役立ちます。 –

+1

あなたが助けてくれたすべての回答をupvoteし、最も有用な回答を受け入れることをお勧めしますか?私はあなたがいくつかの質問をしたことを見ていますが、決して答えをアップアップしたり受け入れたりしませんでした。これにより、コミュニティや同様の質問をする可能性のある他のユーザーに役立ちます。 – alttag

答えて

1

があなたのLIKE式の項の周りに括弧を使用しないでください。これは、おそらくあなたが見ている構文エラーの原因です。代わりに、単に1つの状態を有するこのCASE表現を使用してみてください:

SELECT CASE WHEN UPPER(description) NOT LIKE 'A A%' AND 
       UPPER(description) NOT LIKE 'A E%' AND 
       UPPER(description) NOT LIKE 'A I%' AND 
       UPPER(description) NOT LIKE 'A O%' AND 
       UPPER(description) NOT LIKE 'A U%' 
      THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description)) -- replace A with An 
      ELSE description  -- otherwise use original description 
     END AS description 
FROM yourTable 

ます。また、母音で始まるタイトルないに一致するように、負の文字クラス[^aeiou]とここREGEXPを使用することができます。

SELECT CASE WHEN description REGEXP '^A [^aeiou]' 
      THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description)) 
      ELSE description 
     END AS description 
FROM yourTable 
+0

お返事ありがとうございます!私はこれらを見ます! – user6749426

0

あなたの質問は本当にいくつかの質問です。

複数の「列」のデータを1つの列として取得するには、別々のクエリを使用し、その間にUNIONを使用します。

これは実際問題ではありません。

WHERE句のチェック(「if」)を実行し、置換をSELECTに1回だけ行う方がよい場合があります。

これは未テストですが、近いあなたが望むものにあなたを取得することがあります。

SELECT 
    CONCAT('An ', TRIM(LEADING 'A ' FROM description)) AS descrip 
FROM film_text 
WHERE description REGEXP '^A [aeiou]';  

REGEXPはあなたCASEで実行しようとしていたチェックを行い、そして行のみに結果セットを制限します。

すべての説明を返して、すべての説明を返すには、REGEXの構文を最初に試したCASEと組み合わせることができます。

SELECT 
    CASE WHEN description REGEXP '^A [aeiou]' 
    THEN CONCAT('An ', TRIM(LEADING 'A ' FROM description)) 
    ELSE description 
    END AS description 
FROM film_text; 
+0

編集した追加はすべてを取り上げるべきである。大文字と小文字の区別は、まずテーブルの照合順序(提供されません)によって異なります。また、[docsから](http://dev.mysql.com/doc/refman/5.7/en/regexp。html) "REGEXPでは大文字と小文字が区別されません。ただし、バイナリ文字列で使用する場合を除きます。 – alttag

+0

ありがとうございました。私はSQLに非常に新しいですし、これは物事を理解するのを助けています – user6749426