いつもお世話になります、不幸一です。
早速ですが質問がありますの宜しくお願いします。
環境:WindowsXP、VisualStudioC++6.0、SQL Server2008R2
現在使用しているデータベースがACCESSですが、SQLサーバーへ移行する予定です。
データベースは変換され問題無いのですが、ODBC接続でSQLを実行している部分が上手く
実行されません。
SQL分は以下の通りです。
SELECT DISTINCT (Left(Type,4)='ABC_' Or Left(Type,4)='XYZ_') AS TypeIsAlpha FROM
[TestDb].[dbo].[Variable];
SQLServerで実行しても以下のエラーとなります。エラーから推測するにLeft関数の戻り
値で文字列比較をしている部分にあると思いますが、この場合どのように修正すればいい
のか分かりません。ネットでもいろいろ調べましたが類似の問題が無く困っております。
どうかお助けください。
メッセージ 102、レベル 15、状態 1、行 1
'=' 付近に不適切な構文があります。
SELECTなどの基本的な構文はともかく、拡張的な部分では、
DBエンジンによって、SQL文は異なります。
Left()などの構文は文法が変わる恐れがあります。
一度、渡しているSQL文をSQL Server上でクエリーとして実行してみて下さい。
エラーメッセージで分かるかも知れません。
分からないようなら、
SQL Server関連の会議室で質問すると良い回答が得られるかも知れません。
よく見たら、
Left(Type,4)='ABC_' Or Left(Type,4)='XYZ_'
の部分ってWHERE句なのでは?
bunさん
回答ありがとうございます。
SQLサーバー上で実行した結果は
メッセージ 102、レベル 15、状態 1、行 1
'=' 付近に不適切な構文があります。
でした。
>よく見たら、
> Left(Type,4)='ABC_' Or Left(Type,4)='XYZ_'
>の部分ってWHERE句なのでは?
ACCESSの作成者がもうすでにいないので分かりませんがそもそも間違っているのでしょうか?
> ACCESSの作成者がもうすでにいないので分かりませんが
> そもそも間違っているのでしょうか?
そんな気がします。
> Left(Type,4)='ABC_' Or Left(Type,4)='XYZ_'
だと論理式なので、結果は真偽値でしかない。
それを表示したいのなら、それでいいのですが。
どうなんでしょう?
ちなみに、
> AS TypeIsAlpha
だから、そうととれなくも無い。
エラーメッセージの意味ですが、
私は、データベースは AccessとOracleしか使ったことが
無いので、SQL Serverのクエリーは分からないです。
すいません。
bunさん
回答ありがとうございます。
>> Left(Type,4)='ABC_' Or Left(Type,4)='XYZ_'
>だと論理式なので、結果は真偽値でしかない。
>それを表示したいのなら、それでいいのですが。
>どうなんでしょう?
おっしゃるとおりです。
結果の真偽値を別名列で表示させたいのです。
WHERE句にも入れてみましたがやはり思った通りの結果は得られませんでした。
何か良い方法ありませんでしょうか、宜しくお願い致します。
クエリの内容についてはここの例Bを参考にしてみてください。
http://msdn.microsoft.com/ja-jp/library/ms181765.aspx
CASE式で振り分けてしまえばよいでしょう。
MSDN: 比較演算子 (Transact-SQL)
http://msdn.microsoft.com/ja-jp/library/ms188074.aspx
> 比較演算子の結果は Boolean 型になります。有効値には、TRUE、FALSE、UNKNOWN があり
ます。Boolean 型を返す式は、ブール式とも呼ばれます。
> Boolean データ型は SQL Server の他のデータ型と異なり、テーブルの列や変数のデー
タ型として指定することはできず、結果セットで返すこともできません。
なので,比較結果をそのままSELECTで返せません。
が,CASE式を使ってBoolean型を適当な値にしてしまえば結果セットで返せます。
ref)
MSDN: CASE (Transact-SQL)
http://msdn.microsoft.com/ja-jp/library/ms181765.aspx
Site: CASE式のススメ - リレーショナル・データベースの世界 - ミックのページ
http://www.geocities.jp/mickindex/database/db_case.html
subaruさん
YuOさん
回答ありがとうございます。
アドバイス通りにCASE分を利用すれば簡単に出来ました。
いろいろと有難うございました。